Lines Matching refs:mc

262 	struct mlx_ccb *mc;  in mlx_init()  local
319 mc = malloc(sizeof(*mc) * MLX_MAX_QUEUECNT, M_DEVBUF, M_WAITOK); in mlx_init()
320 mlx->mlx_ccbs = mc; in mlx_init()
322 for (i = 0; i < MLX_MAX_QUEUECNT; i++, mc++) { in mlx_init()
323 mc->mc_ident = i; in mlx_init()
327 &mc->mc_xfer_map); in mlx_init()
331 mlx_ccb_free(mlx, mc); in mlx_init()
972 struct mlx_ccb *mc, *nmc; in mlx_periodic() local
1038 for (mc = TAILQ_FIRST(&mlx->mlx_ccb_worklist); mc != NULL; mc = nmc) { in mlx_periodic()
1039 nmc = TAILQ_NEXT(mc, mc_chain.tailq); in mlx_periodic()
1040 if (mc->mc_expiry > time_second) { in mlx_periodic()
1047 TAILQ_REMOVE(&mlx->mlx_ccb_worklist, mc, mc_chain.tailq); in mlx_periodic()
1048 mc->mc_status = MLX_STATUS_LOST; in mlx_periodic()
1049 if (mc->mc_mx.mx_handler != NULL) in mlx_periodic()
1050 (*mc->mc_mx.mx_handler)(mc); in mlx_periodic()
1051 else if ((mc->mc_flags & MC_WAITING) != 0) in mlx_periodic()
1052 wakeup(mc); in mlx_periodic()
1062 mlx_periodic_enquiry(struct mlx_ccb *mc) in mlx_periodic_enquiry() argument
1073 mlx = device_private(mc->mc_mx.mx_dv); in mlx_periodic_enquiry()
1074 mlx_ccb_unmap(mlx, mc); in mlx_periodic_enquiry()
1079 if (mc->mc_status != 0) { in mlx_periodic_enquiry()
1081 mlx_ccb_diagnose(mc)); in mlx_periodic_enquiry()
1088 switch (mc->mc_mbox[0]) { in mlx_periodic_enquiry()
1094 me = (struct mlx_enquiry *)mc->mc_mx.mx_context; in mlx_periodic_enquiry()
1095 meo = (struct mlx_enquiry_old *)mc->mc_mx.mx_context; in mlx_periodic_enquiry()
1136 me = (struct mlx_enquiry *)mc->mc_mx.mx_context; in mlx_periodic_enquiry()
1166 mes = (struct mlx_enq_sys_drive *)mc->mc_mx.mx_context; in mlx_periodic_enquiry()
1208 if (mc->mc_mbox[0] == MLX_CMD_ENQSYSDRIVE) in mlx_periodic_enquiry()
1213 free(mc->mc_mx.mx_context, M_DEVBUF); in mlx_periodic_enquiry()
1214 mlx_ccb_free(mlx, mc); in mlx_periodic_enquiry()
1224 struct mlx_ccb *mc; in mlx_periodic_eventlog_poll() local
1230 if ((rv = mlx_ccb_alloc(mlx, &mc, 1)) != 0) in mlx_periodic_eventlog_poll()
1237 if ((rv = mlx_ccb_map(mlx, mc, result, 1024, MC_XFER_IN)) != 0) in mlx_periodic_eventlog_poll()
1239 if (mc->mc_nsgent != 1) { in mlx_periodic_eventlog_poll()
1240 mlx_ccb_unmap(mlx, mc); in mlx_periodic_eventlog_poll()
1246 mlx_make_type3(mc, MLX_CMD_LOGOP, MLX_LOGOP_GET, 1, in mlx_periodic_eventlog_poll()
1247 mlx->mlx_lastevent, 0, 0, mc->mc_xfer_phys, 0); in mlx_periodic_eventlog_poll()
1249 mc->mc_mx.mx_handler = mlx_periodic_eventlog_respond; in mlx_periodic_eventlog_poll()
1250 mc->mc_mx.mx_dv = mlx->mlx_dv; in mlx_periodic_eventlog_poll()
1251 mc->mc_mx.mx_context = result; in mlx_periodic_eventlog_poll()
1254 mlx_ccb_enqueue(mlx, mc); in mlx_periodic_eventlog_poll()
1258 if (mc != NULL) in mlx_periodic_eventlog_poll()
1259 mlx_ccb_free(mlx, mc); in mlx_periodic_eventlog_poll()
1271 mlx_periodic_eventlog_respond(struct mlx_ccb *mc) in mlx_periodic_eventlog_respond() argument
1278 mlx = device_private(mc->mc_mx.mx_dv); in mlx_periodic_eventlog_respond()
1279 el = mc->mc_mx.mx_context; in mlx_periodic_eventlog_respond()
1280 mlx_ccb_unmap(mlx, mc); in mlx_periodic_eventlog_respond()
1284 if (mc->mc_status == 0) { in mlx_periodic_eventlog_respond()
1351 "error reading message log - %s\n", mlx_ccb_diagnose(mc)); in mlx_periodic_eventlog_respond()
1360 free(mc->mc_mx.mx_context, M_DEVBUF); in mlx_periodic_eventlog_respond()
1361 mlx_ccb_free(mlx, mc); in mlx_periodic_eventlog_respond()
1376 mlx_periodic_rebuild(struct mlx_ccb *mc) in mlx_periodic_rebuild() argument
1382 mlx = device_private(mc->mc_mx.mx_dv); in mlx_periodic_rebuild()
1383 mr = mc->mc_mx.mx_context; in mlx_periodic_rebuild()
1384 mlx_ccb_unmap(mlx, mc); in mlx_periodic_rebuild()
1386 switch (mc->mc_status) { in mlx_periodic_rebuild()
1438 free(mc->mc_mx.mx_context, M_DEVBUF); in mlx_periodic_rebuild()
1439 mlx_ccb_free(mlx, mc); in mlx_periodic_rebuild()
1450 struct mlx_ccb *mc; in mlx_pause_action() local
1477 if (mlx_ccb_alloc(mlx, &mc, 1) != 0) { in mlx_pause_action()
1486 mlx_make_type2(mc, cmd, (failsafe << 4) | i, 0, 0, in mlx_pause_action()
1488 mc->mc_mx.mx_handler = mlx_pause_done; in mlx_pause_action()
1489 mc->mc_mx.mx_dv = mlx->mlx_dv; in mlx_pause_action()
1491 mlx_ccb_enqueue(mlx, mc); in mlx_pause_action()
1497 mlx_pause_done(struct mlx_ccb *mc) in mlx_pause_done() argument
1502 mlx = device_private(mc->mc_mx.mx_dv); in mlx_pause_done()
1503 command = mc->mc_mbox[0]; in mlx_pause_done()
1504 channel = mc->mc_mbox[2] & 0xf; in mlx_pause_done()
1506 if (mc->mc_status != 0) in mlx_pause_done()
1509 mlx_ccb_diagnose(mc)); in mlx_pause_done()
1518 mlx_ccb_free(mlx, mc); in mlx_pause_done()
1530 void (*handler)(struct mlx_ccb *mc), int waitok) in mlx_enquire() argument
1532 struct mlx_ccb *mc; in mlx_enquire() local
1539 if ((rv = mlx_ccb_alloc(mlx, &mc, 1)) != 0) in mlx_enquire()
1547 if ((rv = mlx_ccb_map(mlx, mc, result, bufsize, MC_XFER_IN)) != 0) in mlx_enquire()
1550 if (mc->mc_nsgent != 1) { in mlx_enquire()
1556 mlx_make_type2(mc, command, 0, 0, 0, 0, 0, 0, mc->mc_xfer_phys, 0); in mlx_enquire()
1560 mc->mc_mx.mx_context = result; in mlx_enquire()
1561 mc->mc_mx.mx_dv = mlx->mlx_dv; in mlx_enquire()
1562 mc->mc_mx.mx_handler = handler; in mlx_enquire()
1563 mlx_ccb_enqueue(mlx, mc); in mlx_enquire()
1567 rv = mlx_ccb_wait(mlx, mc); in mlx_enquire()
1569 rv = mlx_ccb_poll(mlx, mc, 5000); in mlx_enquire()
1574 if (handler == NULL && mc != NULL) { in mlx_enquire()
1576 mlx_ccb_unmap(mlx, mc); in mlx_enquire()
1577 mlx_ccb_free(mlx, mc); in mlx_enquire()
1582 if (mc != NULL) in mlx_enquire()
1583 mlx_ccb_free(mlx, mc); in mlx_enquire()
1600 struct mlx_ccb *mc; in mlx_flush() local
1603 if ((rv = mlx_ccb_alloc(mlx, &mc, 1)) != 0) in mlx_flush()
1607 mlx_make_type2(mc, MLX_CMD_FLUSH, 0, 0, 0, 0, 0, 0, 0, 0); in mlx_flush()
1610 rv = mlx_ccb_wait(mlx, mc); in mlx_flush()
1612 rv = mlx_ccb_poll(mlx, mc, MLX_TIMEOUT * 1000); in mlx_flush()
1617 if (mc->mc_status != 0) { in mlx_flush()
1619 mlx_ccb_diagnose(mc)); in mlx_flush()
1623 if (mc != NULL) in mlx_flush()
1624 mlx_ccb_free(mlx, mc); in mlx_flush()
1635 struct mlx_ccb *mc; in mlx_check() local
1641 if (mlx_ccb_alloc(mlx, &mc, 1) != 0) in mlx_check()
1645 mlx_make_type2(mc, MLX_CMD_CHECKASYNC, 0, 0, 0, 0, 0, drive | 0x80, in mlx_check()
1649 if (mlx_ccb_wait(mlx, mc) != 0) in mlx_check()
1653 if (mc->mc_status != 0) in mlx_check()
1655 mlx_ccb_diagnose(mc)); in mlx_check()
1660 rv = mc->mc_status; in mlx_check()
1662 if (mc != NULL) in mlx_check()
1663 mlx_ccb_free(mlx, mc); in mlx_check()
1677 struct mlx_ccb *mc; in mlx_rebuild() local
1681 if (mlx_ccb_alloc(mlx, &mc, 1) != 0) in mlx_rebuild()
1685 mlx_make_type2(mc, MLX_CMD_REBUILDASYNC, channel, target, 0, 0, 0, 0, in mlx_rebuild()
1689 if (mlx_ccb_wait(mlx, mc) != 0) in mlx_rebuild()
1693 if (mc->mc_status != 0) in mlx_rebuild()
1695 mlx_ccb_diagnose(mc)); in mlx_rebuild()
1700 error = mc->mc_status; in mlx_rebuild()
1703 if (mc != NULL) in mlx_rebuild()
1704 mlx_ccb_free(mlx, mc); in mlx_rebuild()
1720 struct mlx_ccb *mc; in mlx_user_command() local
1733 if ((rv = mlx_ccb_alloc(mlx, &mc, 1)) != 0) { in mlx_user_command()
1738 memcpy(mc->mc_mbox, mu->mu_command, sizeof(mc->mc_mbox)); in mlx_user_command()
1765 rv = mlx_ccb_map(mlx, mc, kbuf, mu->mu_datasize, mu->mu_bufdir); in mlx_user_command()
1770 if (mc->mc_nsgent > 1) { in mlx_user_command()
1782 if (mc->mc_mbox[0] == MLX_CMD_DIRECT_CDB) { in mlx_user_command()
1784 dcdb->dcdb_physaddr = mc->mc_xfer_phys + sizeof(*dcdb); in mlx_user_command()
1802 mc->mc_mbox[mu->mu_bufptr] = mc->mc_xfer_phys; in mlx_user_command()
1803 mc->mc_mbox[mu->mu_bufptr+1] = mc->mc_xfer_phys >> 8; in mlx_user_command()
1804 mc->mc_mbox[mu->mu_bufptr+2] = mc->mc_xfer_phys >> 16; in mlx_user_command()
1805 mc->mc_mbox[mu->mu_bufptr+3] = mc->mc_xfer_phys >> 24; in mlx_user_command()
1809 if ((rv = mlx_ccb_wait(mlx, mc)) != 0) { in mlx_user_command()
1816 if (mc != NULL) { in mlx_user_command()
1818 mu->mu_status = mc->mc_status; in mlx_user_command()
1820 mlx_ccb_unmap(mlx, mc); in mlx_user_command()
1821 mlx_ccb_free(mlx, mc); in mlx_user_command()
1845 struct mlx_ccb *mc; in mlx_ccb_alloc() local
1849 mc = SLIST_FIRST(&mlx->mlx_ccb_freelist); in mlx_ccb_alloc()
1856 mc->mc_flags |= MC_CONTROL; in mlx_ccb_alloc()
1862 *mcp = mc; in mlx_ccb_alloc()
1870 mlx_ccb_free(struct mlx_softc *mlx, struct mlx_ccb *mc) in mlx_ccb_free() argument
1875 if ((mc->mc_flags & MC_CONTROL) != 0) in mlx_ccb_free()
1877 mc->mc_flags = 0; in mlx_ccb_free()
1878 SLIST_INSERT_HEAD(&mlx->mlx_ccb_freelist, mc, mc_chain.slist); in mlx_ccb_free()
1888 mlx_ccb_enqueue(struct mlx_softc *mlx, struct mlx_ccb *mc) in mlx_ccb_enqueue() argument
1894 if (mc != NULL) in mlx_ccb_enqueue()
1895 SIMPLEQ_INSERT_TAIL(&mlx->mlx_ccb_queue, mc, mc_chain.simpleq); in mlx_ccb_enqueue()
1897 while ((mc = SIMPLEQ_FIRST(&mlx->mlx_ccb_queue)) != NULL) { in mlx_ccb_enqueue()
1898 if (mlx_ccb_submit(mlx, mc) != 0) in mlx_ccb_enqueue()
1901 TAILQ_INSERT_TAIL(&mlx->mlx_ccb_worklist, mc, mc_chain.tailq); in mlx_ccb_enqueue()
1912 mlx_ccb_map(struct mlx_softc *mlx, struct mlx_ccb *mc, void *data, int size, in mlx_ccb_map() argument
1919 xfer = mc->mc_xfer_map; in mlx_ccb_map()
1928 mc->mc_xfer_size = size; in mlx_ccb_map()
1929 mc->mc_flags |= dir; in mlx_ccb_map()
1930 mc->mc_nsgent = nsegs; in mlx_ccb_map()
1931 mc->mc_xfer_phys = xfer->dm_segs[0].ds_addr; in mlx_ccb_map()
1933 sgloff = MLX_SGL_SIZE * mc->mc_ident; in mlx_ccb_map()
1948 bus_dmamap_sync(mlx->mlx_dmat, xfer, 0, mc->mc_xfer_size, i); in mlx_ccb_map()
1959 mlx_ccb_unmap(struct mlx_softc *mlx, struct mlx_ccb *mc) in mlx_ccb_unmap() argument
1964 MLX_SGL_SIZE * mc->mc_ident, MLX_SGL_SIZE, in mlx_ccb_unmap()
1967 if ((mc->mc_flags & MC_XFER_OUT) != 0) in mlx_ccb_unmap()
1971 if ((mc->mc_flags & MC_XFER_IN) != 0) in mlx_ccb_unmap()
1974 bus_dmamap_sync(mlx->mlx_dmat, mc->mc_xfer_map, 0, mc->mc_xfer_size, i); in mlx_ccb_unmap()
1975 bus_dmamap_unload(mlx->mlx_dmat, mc->mc_xfer_map); in mlx_ccb_unmap()
1983 mlx_ccb_poll(struct mlx_softc *mlx, struct mlx_ccb *mc, int timo) in mlx_ccb_poll() argument
1987 mc->mc_mx.mx_handler = NULL; in mlx_ccb_poll()
1989 if ((rv = mlx_ccb_submit(mlx, mc)) != 0) in mlx_ccb_poll()
1991 TAILQ_INSERT_TAIL(&mlx->mlx_ccb_worklist, mc, mc_chain.tailq); in mlx_ccb_poll()
1995 if (mc->mc_status != MLX_STATUS_BUSY) in mlx_ccb_poll()
2001 if (mc->mc_status != 0) { in mlx_ccb_poll()
2003 mlx_ccb_diagnose(mc)); in mlx_ccb_poll()
2020 mlx_ccb_wait(struct mlx_softc *mlx, struct mlx_ccb *mc) in mlx_ccb_wait() argument
2024 mc->mc_flags |= MC_WAITING; in mlx_ccb_wait()
2025 mc->mc_mx.mx_handler = NULL; in mlx_ccb_wait()
2028 mlx_ccb_enqueue(mlx, mc); in mlx_ccb_wait()
2029 tsleep(mc, PRIBIO, "mlxwccb", 0); in mlx_ccb_wait()
2032 if (mc->mc_status != 0) { in mlx_ccb_wait()
2034 mlx_ccb_diagnose(mc)); in mlx_ccb_wait()
2046 mlx_ccb_submit(struct mlx_softc *mlx, struct mlx_ccb *mc) in mlx_ccb_submit() argument
2051 mc->mc_mbox[1] = (u_int8_t)(mc->mc_ident + 1); in mlx_ccb_submit()
2054 mc->mc_status = MLX_STATUS_BUSY; in mlx_ccb_submit()
2055 mc->mc_expiry = time_second + MLX_TIMEOUT; in mlx_ccb_submit()
2060 r = (*mlx->mlx_submit)(mlx, mc); in mlx_ccb_submit()
2070 mc->mc_status = MLX_STATUS_WEDGED; in mlx_ccb_submit()
2078 mlx_ccb_diagnose(struct mlx_ccb *mc) in mlx_ccb_diagnose() argument
2084 if ((mc->mc_mbox[0] == mlx_msgs[i].command || in mlx_ccb_diagnose()
2086 mc->mc_status == mlx_msgs[i].status) { in mlx_ccb_diagnose()
2088 mlx_status_msgs[mlx_msgs[i].msg], mc->mc_status); in mlx_ccb_diagnose()
2093 (int)mc->mc_status, (int)mc->mc_mbox[0]); in mlx_ccb_diagnose()
2106 struct mlx_ccb *mc; in mlx_intr() local
2123 mc = mlx->mlx_ccbs + ident; in mlx_intr()
2125 if (mc->mc_status != MLX_STATUS_BUSY) { in mlx_intr()
2131 TAILQ_REMOVE(&mlx->mlx_ccb_worklist, mc, mc_chain.tailq); in mlx_intr()
2134 mc->mc_status = status; in mlx_intr()
2135 if (mc->mc_mx.mx_handler != NULL) in mlx_intr()
2136 (*mc->mc_mx.mx_handler)(mc); in mlx_intr()
2137 else if ((mc->mc_flags & MC_WAITING) != 0) in mlx_intr()
2138 wakeup(mc); in mlx_intr()