Lines Matching defs:mpt
73 * Adapted from the FreeBSD "mpt" driver by Jason R. Thorpe for
84 #include <dev/ic/mpt.h> /* pulls in all headers */
119 mpt_scsipi_attach(mpt_softc_t *mpt)
121 struct scsipi_adapter *adapt = &mpt->sc_adapter;
122 struct scsipi_channel *chan = &mpt->sc_channel;
125 mpt->bus = 0; /* XXX ?? */
127 maxq = (mpt->mpt_global_credits < MPT_MAX_REQUESTS(mpt)) ?
128 mpt->mpt_global_credits : MPT_MAX_REQUESTS(mpt);
132 adapt->adapt_dev = mpt->sc_dev;
143 if (mpt->is_sas) {
145 } else if (mpt->is_fc) {
153 chan->chan_ntargets = mpt->mpt_max_devices ? mpt->mpt_max_devices : 256;
154 chan->chan_id = mpt->mpt_ini_id;
160 mpt->sc_scsibus_dv = config_found(mpt->sc_dev, &mpt->sc_channel,
164 if (mpt_is_raid(mpt)) {
165 if (bio_register(mpt->sc_dev, mpt_bio_ioctl) != 0)
167 device_xname(mpt->sc_dev));
173 mpt_dma_mem_alloc(mpt_softc_t *mpt)
183 if (mpt->reply != NULL)
190 len = sizeof(request_t) * MPT_MAX_REQUESTS(mpt);
191 mpt->request_pool = malloc(len, M_DEVBUF, M_WAITOK | M_ZERO);
192 if (mpt->request_pool == NULL) {
193 aprint_error_dev(mpt->sc_dev, "unable to allocate request pool\n");
200 error = bus_dmamem_alloc(mpt->sc_dmat, PAGE_SIZE, PAGE_SIZE, 0,
203 aprint_error_dev(mpt->sc_dev, "unable to allocate reply area, error = %d\n",
208 error = bus_dmamem_map(mpt->sc_dmat, &reply_seg, reply_rseg, PAGE_SIZE,
209 (void **) &mpt->reply, BUS_DMA_COHERENT/*XXX*/);
211 aprint_error_dev(mpt->sc_dev, "unable to map reply area, error = %d\n",
216 error = bus_dmamap_create(mpt->sc_dmat, PAGE_SIZE, 1, PAGE_SIZE,
217 0, 0, &mpt->reply_dmap);
219 aprint_error_dev(mpt->sc_dev, "unable to create reply DMA map, error = %d\n",
224 error = bus_dmamap_load(mpt->sc_dmat, mpt->reply_dmap, mpt->reply,
227 aprint_error_dev(mpt->sc_dev, "unable to load reply DMA map, error = %d\n",
231 mpt->reply_phys = mpt->reply_dmap->dm_segs[0].ds_addr;
236 error = bus_dmamem_alloc(mpt->sc_dmat, MPT_REQ_MEM_SIZE(mpt),
239 aprint_error_dev(mpt->sc_dev, "unable to allocate request area, "
244 error = bus_dmamem_map(mpt->sc_dmat, &request_seg, request_rseg,
245 MPT_REQ_MEM_SIZE(mpt), (void **) &mpt->request, 0);
247 aprint_error_dev(mpt->sc_dev, "unable to map request area, error = %d\n",
252 error = bus_dmamap_create(mpt->sc_dmat, MPT_REQ_MEM_SIZE(mpt), 1,
253 MPT_REQ_MEM_SIZE(mpt), 0, 0, &mpt->request_dmap);
255 aprint_error_dev(mpt->sc_dev, "unable to create request DMA map, "
260 error = bus_dmamap_load(mpt->sc_dmat, mpt->request_dmap, mpt->request,
261 MPT_REQ_MEM_SIZE(mpt), NULL, 0);
263 aprint_error_dev(mpt->sc_dev, "unable to load request DMA map, error = %d\n",
267 mpt->request_phys = mpt->request_dmap->dm_segs[0].ds_addr;
269 pptr = mpt->request_phys;
270 vptr = (void *) mpt->request;
271 end = pptr + MPT_REQ_MEM_SIZE(mpt);
274 request_t *req = &mpt->request_pool[i];
287 error = bus_dmamap_create(mpt->sc_dmat, MAXPHYS,
290 aprint_error_dev(mpt->sc_dev, "unable to create req %d DMA map, "
300 request_t *req = &mpt->request_pool[i];
302 bus_dmamap_destroy(mpt->sc_dmat, req->dmap);
304 bus_dmamap_unload(mpt->sc_dmat, mpt->request_dmap);
306 bus_dmamap_destroy(mpt->sc_dmat, mpt->request_dmap);
308 bus_dmamem_unmap(mpt->sc_dmat, (void *)mpt->request, PAGE_SIZE);
310 bus_dmamem_free(mpt->sc_dmat, &request_seg, request_rseg);
312 bus_dmamap_unload(mpt->sc_dmat, mpt->reply_dmap);
314 bus_dmamap_destroy(mpt->sc_dmat, mpt->reply_dmap);
316 bus_dmamem_unmap(mpt->sc_dmat, (void *)mpt->reply, PAGE_SIZE);
318 bus_dmamem_free(mpt->sc_dmat, &reply_seg, reply_rseg);
320 free(mpt->request_pool, M_DEVBUF);
322 mpt->reply = NULL;
323 mpt->request = NULL;
324 mpt->request_pool = NULL;
332 mpt_softc_t *mpt = arg;
335 if ((mpt_read(mpt, MPT_OFFSET_INTR_STATUS) & MPT_INTR_REPLY_READY) == 0)
338 nrepl = mpt_drain_queue(mpt);
343 mpt_prt(mpt_softc_t *mpt, const char *fmt, ...)
347 printf("%s: ", device_xname(mpt->sc_dev));
355 mpt_poll(mpt_softc_t *mpt, struct scsipi_xfer *xs, int count)
360 mpt_intr(mpt);
375 mpt_softc_t *mpt;
386 mpt = device_private(periph->periph_channel->chan_adapter->adapt_dev);
393 mpt->timeouts++;
394 if (mpt_intr(mpt)) {
396 mpt->success++;
397 mpt_prt(mpt, "recovered from command timeout");
407 nrepl = mpt_drain_queue(mpt);
409 mpt_prt(mpt, "mpt_timeout: recovered %d commands",nrepl);
413 mpt->success++;
418 mpt_prt(mpt,
421 mpt_check_doorbell(mpt);
422 mpt_prt(mpt, "Status 0x%08x, Mask 0x%08x, Doorbell 0x%08x",
423 mpt_read(mpt, MPT_OFFSET_INTR_STATUS),
424 mpt_read(mpt, MPT_OFFSET_INTR_MASK),
425 mpt_read(mpt, MPT_OFFSET_DOORBELL));
426 mpt_prt(mpt, "request state: %s", mpt_req_state(req->debug));
427 if (mpt->verbose > 1)
432 mpt_restart(mpt, req);
436 mpt_restart(mpt_softc_t *mpt, request_t *req0)
443 if (mpt_soft_reset(mpt) != MPT_OK) {
444 mpt_prt(mpt, "soft reset failed");
453 scsipi_channel_freeze(&mpt->sc_channel, 1);
458 for (i = 0; i < MPT_MAX_REQUESTS(mpt); i++) {
459 req = &mpt->request_pool[i];
463 bus_dmamap_unload(mpt->sc_dmat, req->dmap);
475 mpt_free_request(mpt, req);
480 mpt_prt(mpt, "re-queued %d requests", nreq);
483 if (mpt_init(mpt, MPT_DB_INIT_HOST) == 0)
484 mpt_prt(mpt, "restart succeeded");
488 scsipi_channel_thaw(&mpt->sc_channel, 1);
492 mpt_drain_queue(mpt_softc_t *mpt)
497 reply = mpt_pop_reply_queue(mpt);
500 if (mpt->verbose > 1) {
503 mpt_print_reply(MPT_REPLY_PTOV(mpt, reply));
506 mpt_prt(mpt, "context %u reply OK", reply);
509 mpt_done(mpt, reply);
510 reply = mpt_pop_reply_queue(mpt);
516 mpt_done(mpt_softc_t *mpt, uint32_t reply)
534 mpt_reply = MPT_REPLY_PTOV(mpt, reply);
536 if (mpt->verbose > 1) {
539 mpt_prt(mpt, "Address Reply (index %u):",
541 mpt_prt(mpt, "%08x %08x %08x %08x", pReply[0],
543 mpt_prt(mpt, "%08x %08x %08x %08x", pReply[4],
545 mpt_prt(mpt, "%08x %08x %08x %08x", pReply[8],
560 mpt_ctlop(mpt
562 mpt_prt(mpt, "%s: index 0x%x, NULL reply", __func__,
568 if (__predict_false(index < 0 || index >= MPT_MAX_REQUESTS(mpt))) {
569 mpt_prt(mpt, "%s: invalid index (0x%x) in reply", __func__,
574 req = &mpt->request_pool[index];
578 mpt_prt(mpt, "%s: corrupted request_t (0x%x)", __func__,
583 MPT_SYNC_REQ(mpt, req, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
588 if (mpt->verbose > 1)
589 mpt_prt(mpt, "%s: TASK MGMT", __func__);
590 KASSERT(req == mpt->mngt_req);
591 mpt->mngt_req = NULL;
604 if (mpt->verbose > 1)
605 mpt_prt(mpt, "%s: unknown Function 0x%x (0x%x)",
615 mpt_prt(mpt,
618 mpt_prt(mpt, "request state: %s", mpt_req_state(req->debug));
619 mpt_prt(mpt, "mpt_request:");
623 mpt_prt(mpt, "mpt_reply:");
626 mpt_prt(mpt, "context reply: 0x%08x", reply);
640 bus_dmamap_sync(mpt->sc_dmat, req->dmap, 0,
644 bus_dmamap_unload(mpt->sc_dmat, req->dmap);
654 if (__predict_false(mpt->mpt_report_xfer_mode != 0)) {
655 if ((mpt->mpt_report_xfer_mode &
657 mpt_get_xfer_mode(mpt, periph);
662 mpt_free_request(mpt, req);
671 mpt_prt(mpt, "%s: IOC overrun!", __func__);
694 if ((mpt->mpt_report_xfer_mode &
696 mpt_get_xfer_mode(mpt, periph);
730 mpt_prt(mpt, "%s: IOC SCSI residual mismatch!", __func__);
736 mpt_prt(mpt, "%s: IOC SCSI task terminated!", __func__);
743 mpt_prt(mpt, "%s: IOC SCSI task failed!", __func__);
750 mpt_prt(mpt, "%s: IOC task terminated!", __func__);
757 mpt_prt(mpt, "%s: IOC SCSI bus reset!", __func__);
769 mpt_prt(mpt, "%s: IOC indicates protocol error -- "
779 mpt_prt(mpt, "%s: IOC returned unknown code: 0x%x", __func__,
803 mpt_prt(mpt, "%s: IOC has error - logging...\n", __func__);
804 mpt_ctlop(mpt, mpt_reply, reply);
809 mpt_free_request(mpt, req);
813 mpt_free_reply(mpt, (reply << 1));
819 mpt_prt(mpt, "%s: IOC fatal error: restarting...", __func__);
820 mpt_restart(mpt, NULL);
825 mpt_run_xfer(mpt_softc_t *mpt, struct scsipi_xfer *xs)
833 req = mpt_get_request(mpt);
851 mpt_req->Bus = mpt->bus;
876 if (__predict_true((!mpt->is_scsi) ||
877 (mpt->mpt_tag_enable &
899 if (mpt->is_scsi)
908 if (__predict_false(mpt->is_scsi &&
909 (mpt->mpt_disc_enable &
928 error = bus_dmamap_load(mpt->sc_dmat, req->dmap, xs->data,
946 mpt_prt(mpt, "error %d loading DMA map", error);
949 mpt_free_request(mpt, req);
955 if (req->dmap->dm_nsegs > MPT_NSGL_FIRST(mpt)) {
966 for (i = 0; i < MPT_NSGL_FIRST(mpt) - 1;
976 if (i == MPT_NSGL_FIRST(mpt) - 2)
1000 if (nleft > MPT_NSGL(mpt)) {
1001 ntodo = MPT_NSGL(mpt) - 1;
1002 ce->NextChainOffset = (MPT_RQSL(mpt) -
1004 ce->Length = htole16(MPT_NSGL(mpt)
1039 bus_dmamap_sync(mpt->sc_dmat, req->dmap, 0,
1073 bus_dmamap_sync(mpt->sc_dmat, req->dmap, 0,
1092 if (mpt->verbose > 1)
1096 mpt_prt(mpt, "mpt_run_xfer: no timeout specified for request: 0x%x\n",
1105 mpt_send_cmd(mpt, req);
1114 if (mpt_poll(mpt, xs, xs->timeout))
1119 mpt_set_xfer_mode(mpt_softc_t *mpt, struct scsipi_xfer_mode *xm)
1124 mpt->mpt_tag_enable |= (1 << xm->xm_target);
1126 mpt->mpt_tag_enable &= ~(1 << xm->xm_target);
1128 if (mpt->is_scsi) {
1133 mpt->mpt_disc_enable |= (1 << xm->xm_target);
1140 tmp = mpt->mpt_dev_page1[xm->xm_target];
1164 factor = (mpt->mpt_port_page0.Capabilities >> 8) & 0xff;
1165 offset = (mpt->mpt_port_page0.Capabilities >> 16) & 0xff;
1180 if (mpt_write_cfg_page(mpt, xm->xm_target, &tmp.Header)) {
1181 mpt_prt(mpt, "unable to write Device Page 1");
1185 if (mpt_read_cfg_page(mpt, xm->xm_target, &tmp.Header)) {
1186 mpt, "unable to read back Device Page 1");
1191 mpt->mpt_dev_page1[xm->xm_target] = tmp;
1192 if (mpt->verbose > 1) {
1193 mpt_prt(mpt,
1196 mpt->mpt_dev_page1[xm->xm_target].RequestedParameters,
1197 mpt->mpt_dev_page1[xm->xm_target].Configuration);
1206 mpt->mpt_report_xfer_mode |= (1 << xm->xm_target);
1210 mpt_get_xfer_mode(mpt_softc_t *mpt, struct scsipi_periph *periph)
1216 tmp = mpt->mpt_dev_page0[periph->periph_target];
1218 if (mpt_read_cfg_page(mpt, periph->periph_target, &tmp.Header)) {
1219 mpt_prt(mpt, "unable to read Device Page 0");
1224 if (mpt->verbose > 1) {
1225 mpt_prt(mpt,
1249 if (mpt->mpt_tag_enable & (1 << periph->periph_target))
1255 mpt->mpt_report_xfer_mode &= ~(1 << periph->periph_target);
1257 scsipi_async_event(&mpt->sc_channel, ASYNC_EVENT_XFER_MODE, &xm);
1261 mpt_ctlop(mpt_softc_t *mpt, void *vmsg, uint32_t reply)
1267 mpt_event_notify_reply(mpt, vmsg);
1268 mpt_free_reply(mpt, (reply << 1));
1275 mpt_free_reply(mpt, (reply << 1));
1276 if (index >= 0 && index < MPT_MAX_REQUESTS(mpt)) {
1277 request_t *req = &mpt->request_pool[index];
1278 mpt_free_request(mpt, req);
1287 if (mpt->verbose > 1)
1288 mpt_prt(mpt, "enable port reply index %d", index);
1289 if (index >= 0 && index < MPT_MAX_REQUESTS(mpt)) {
1290 request_t *req = &mpt->request_pool[index];
1293 mpt_free_reply(mpt, (reply << 1));
1301 if (index >= 0 && index < MPT_MAX_REQUESTS(mpt)) {
1302 request_t *req = &mpt->request_pool[index];
1306 mpt_free_reply(mpt, (reply << 1));
1311 mpt_prt(mpt, "unknown ctlop: 0x%x", dmsg->Function);
1316 mpt_event_notify_reply(mpt_softc_t *mpt, MSG_EVENT_NOTIFY_REPLY *msg)
1325 mpt_prt(mpt, "EvtLogData: IOCLogInfo: 0x%08x", msg->IOCLogInfo);
1326 mpt_prt(mpt, "EvtLogData: Event Data:");
1329 printf("%s:\t", device_xname(mpt->sc_dev));
1339 mpt_prt(mpt, "Unit Attn: Bus 0x%02x Target 0x%02x",
1345 mpt_prt(mpt, "IOC Bus Reset Port %d",
1351 mpt_prt(mpt, "External Bus Reset");
1364 mpt_prt(mpt, "Rescan Port %d", (msg->Data[0] >> 8) & 0xff);
1369 mpt_prt(mpt, "Port %d: Link state %s",
1377 mpt_prt(mpt,
1386 mpt_prt(mpt, "\tDevice needs AL_PA");
1388 mpt_prt(mpt, "\tDevice %02x doesn't "
1395 mpt_prt(mpt, "\tDevice detected loop "
1398 mpt_prt(mpt, "\tDevice %02x detected "
1404 mpt_prt(mpt, "\tDevice %02x requests that "
1413 mpt_prt(mpt, "Port %d: FC Link Event: LPE(%02x,%02x) "
1421 mpt_prt(mpt, "Port %d: FC Link Event: LPB(%02x,%02x) "
1429 mpt_prt(mpt, "Port %d: FC Link Event: "
1440 mpt_prt(mpt, "Port %d: FC Logout: N_PortID: %02x",
1454 mpt_prt(mpt, "Phy %d: Link Status Unknown",
1458 mpt_prt(mpt, "Phy %d: Link Disabled",
1462 mpt_prt(mpt, "Phy %d: Failed Speed Negotiation",
1466 mpt_prt(mpt, "Phy %d: SATA OOB Complete",
1470 mpt_prt(mpt, "Phy %d: Link Rate 1.5 Gbps",
1474 mpt_prt(mpt, "Phy %d: Link Rate 3.0 Gbps",
1478 mpt_prt(mpt, "Phy %d: SAS Phy Link Status Event: "
1491 if (mpt->verbose > 0)
1492 mpt_prt(mpt, "Queue Full Event");
1496 mpt_prt(mpt, "Unknown async event: 0x%x", msg->Event);
1504 if ((req = mpt_get_request(mpt)) == NULL) {
1516 mpt_check_doorbell(mpt);
1517 mpt_send_cmd(mpt, req);
1522 mpt_bus_reset(mpt_softc_t *mpt)
1529 if (mpt->mngt_req) {
1534 req = mpt_get_request(mpt);
1536 mpt_prt(mpt, "no mngt request\n");
1540 mpt->mngt_req = req;
1545 mngt_req->Bus = mpt->bus;
1551 mpt->is_fc ? MPI_SCSITASKMGMT_MSGFLAGS_LIP_RESET_OPTION : 0;
1555 mpt_send_handshake_cmd(mpt, sizeof(*mngt_req), mngt_req);
1568 mpt_softc_t *mpt = device_private(adapt->adapt_dev);
1572 mpt_run_xfer(mpt, (struct scsipi_xfer *) arg);
1580 mpt_set_xfer_mode(mpt, (struct scsipi_xfer_mode *) arg);
1604 mpt_softc_t *mpt;
1607 mpt = device_private(chan->chan_adapter->adapt_dev);
1610 mpt_bus_reset(mpt);
1612 mpt_intr(mpt);
1622 mpt_get_cfg_page_ioc2(mpt_softc_t *mpt)
1628 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_IOC, 2, 0, &hdr);
1638 rv = mpt_read_cfg_page(mpt, 0, &ioc2->Header);
1651 mpt_get_cfg_page_ioc3(mpt_softc_t *mpt)
1657 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_IOC, 3, 0, &hdr);
1667 rv = mpt_read_cfg_page(mpt, 0, &ioc3->Header);
1680 mpt_get_cfg_page_raid_vol0(mpt_softc_t *mpt, int address)
1686 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 0,
1697 rv = mpt_read_cfg_page(mpt, address, &rvol0->Header);
1710 mpt_get_cfg_page_raid_phys_disk0(mpt_softc_t *mpt, int address)
1716 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0,
1727 rv = mpt_read_cfg_page(mpt, address, &physdisk0->Header);
1740 mpt_is_raid(mpt_softc_t *mpt)
1745 ioc2 = mpt_get_cfg_page_ioc2(mpt);
1764 mpt_softc_t *mpt = device_private(dev);
1772 error = mpt_bio_ioctl_inq(mpt, addr);
1775 error = mpt_bio_ioctl_vol(mpt, addr);
1778 error = mpt_bio_ioctl_disk_novol(mpt, addr);
1781 error = mpt_bio_ioctl_disk(mpt, addr);
1795 mpt_bio_ioctl_inq(mpt_softc_t *mpt, struct bioc_inq *bi)
1800 ioc2 = mpt_get_cfg_page_ioc2(mpt);
1803 ioc3 = mpt_get_cfg_page_ioc3(mpt);
1809 strlcpy(bi->bi_dev, device_xname(mpt->sc_dev), sizeof(bi->bi_dev));
1820 mpt_bio_ioctl_vol(mpt_softc_t *mpt, struct bioc_vol *bv)
1830 ioc2 = mpt_get_cfg_page_ioc2(mpt);
1840 rvol0 = mpt_get_cfg_page_raid_vol0(mpt, address);
1847 periph = scsipi_lookup_periph(&mpt->sc_channel, ioc2rvol->VolumeBus, 0);
1919 mpt_bio_ioctl_disk_common(mpt_softc_t *mpt, struct bioc_disk *bd,
1925 phys = mpt_get_cfg_page_raid_phys_disk0(mpt, address);
1975 mpt_bio_ioctl_disk_novol(mpt_softc_t *mpt, struct bioc_disk *bd)
1983 ioc2 = mpt_get_cfg_page_ioc2(mpt);
1986 ioc3 = mpt_get_cfg_page_ioc3(mpt);
1997 mpt_bio_ioctl_disk_common(mpt, bd, address);
2004 rvol0 = mpt_get_cfg_page_raid_vol0(mpt, address);
2032 mpt_bio_ioctl_disk(mpt_softc_t *mpt, struct bioc_disk *bd)
2039 ioc2 = mpt_get_cfg_page_ioc2(mpt);
2049 rvol0 = mpt_get_cfg_page_raid_vol0(mpt, address);
2058 mpt_bio_ioctl_disk_common(mpt, bd, address);