PERFORCE change 166557 for review
Alexander Motin
mav at FreeBSD.org
Sat Jul 25 15:05:39 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166557
Change 166557 by mav at mav_mavbook on 2009/07/25 15:04:48
Add PMP async notification support for doing automatic PMP rescan on
device hot-plug.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#3 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#3 (text+ko) ====
@@ -63,6 +63,7 @@
typedef enum {
PMP_STATE_NORMAL,
PMP_STATE_PORTS,
+ PMP_STATE_CONFIG,
PMP_STATE_RESET,
PMP_STATE_CONNECT,
PMP_STATE_CHECK,
@@ -265,13 +266,15 @@
"due to status 0x%x\n", status);
break;
}
+ case AC_SCSI_AEN:
case AC_SENT_BDR:
case AC_BUS_RESET:
softc = (struct pmp_softc *)periph->softc;
cam_periph_async(periph, code, path, arg);
- softc->found = 0; /* We have to reset everything. */
- case AC_SCSI_AEN:
- softc = (struct pmp_softc *)periph->softc;
+ if (code == AC_SENT_BDR || code == AC_BUS_RESET)
+ softc->found = 0; /* We have to reset everything. */
+ else if (softc->state != PMP_STATE_NORMAL)
+ break;
softc->state = PMP_STATE_PORTS;
xpt_schedule(periph, CAM_PRIORITY_BUS);
break;
@@ -413,6 +416,17 @@
10 * 1000);
ata_pm_read_cmd(ataio, 2, 15);
break;
+ case PMP_STATE_CONFIG:
+ cam_fill_ataio(ataio,
+ 1,
+ pmpdone,
+ /*flags*/CAM_DIR_NONE,
+ 0,
+ /*data_ptr*/NULL,
+ /*dxfer_len*/0,
+ 10 * 1000);
+ ata_pm_write_cmd(ataio, 0x60, 15, 0xf);
+ break;
case PMP_STATE_RESET:
cam_fill_ataio(ataio,
1,
@@ -503,6 +517,24 @@
if (softc->pm_pid == 0x47261095 && softc->pm_ports == 7)
softc->pm_ports = 5;
printf("PM ports: %d\n", softc->pm_ports);
+ softc->state = PMP_STATE_CONFIG;
+ xpt_release_ccb(done_ccb);
+ xpt_schedule(periph, priority);
+ return;
+ } else if (cam_periph_error(done_ccb, 0, 0,
+ &softc->saved_ccb) == ERESTART) {
+ return;
+ } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
+ cam_release_devq(done_ccb->ccb_h.path,
+ /*relsim_flags*/0,
+ /*reduction*/0,
+ /*timeout*/0,
+ /*getcount_only*/0);
+ }
+ xpt_release_ccb(done_ccb);
+ break;
+ case PMP_STATE_CONFIG:
+ if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
softc->pm_step = 0;
softc->state = PMP_STATE_RESET;
xpt_release_ccb(done_ccb);
@@ -686,10 +718,11 @@
work_ccb->ccb_h.ppriv_ptr0 = done_ccb;
work_ccb->crcn.flags = done_ccb->crcn.flags;
xpt_action(work_ccb);
- break;
+ return;
default:
break;
}
+ softc->state = PMP_STATE_NORMAL;
}
#endif /* _KERNEL */
More information about the p4-projects
mailing list