Home | History | Annotate | Download | only in ic

Lines Matching refs:mc

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