PERFORCE change 169765 for review
Alexander Motin
mav at FreeBSD.org
Sat Oct 24 15:28:44 UTC 2009
http://p4web.freebsd.org/chv.cgi?CH=169765
Change 169765 by mav at mav_mavtest on 2009/10/24 15:28:37
Remove error handle code duplication.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#12 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#12 (text+ko) ====
@@ -492,7 +492,7 @@
struct ccb_ataio *ataio;
union ccb *work_ccb;
struct cam_path *path, *dpath;
- u_int32_t priority;
+ u_int32_t priority, res;
softc = (struct pmp_softc *)periph->softc;
ataio = &done_ccb->ataio;
@@ -502,193 +502,122 @@
path = done_ccb->ccb_h.path;
priority = done_ccb->ccb_h.pinfo.priority;
- switch (softc->state) {
- case PMP_STATE_PORTS:
- if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
- softc->pm_ports = (done_ccb->ataio.res.lba_high << 24) +
- (done_ccb->ataio.res.lba_mid << 16) +
- (done_ccb->ataio.res.lba_low << 8) +
- done_ccb->ataio.res.sector_count;
- /* This PM declares 6 ports, while only 5 of them are real.
- * Port 5 is enclosure management bridge port, which has implementation
- * problems, causing probe faults. Hide it for now. */
- if (softc->pm_pid == 0x37261095 && softc->pm_ports == 6)
- softc->pm_ports = 5;
- /* This PM declares 7 ports, while only 5 of them are real.
- * Port 5 is some fake "Config Disk" with 640 sectors size,
- * port 6 is enclosure management bridge port.
- * Both fake ports has implementation problems, causing
- * probe faults. Hide them for now. */
- 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) {
+ if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ 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);
+ cam_release_devq(done_ccb->ccb_h.path,
+ /*relsim_flags*/0,
+ /*reduction*/0,
+ /*timeout*/0,
+ /*getcount_only*/0);
}
+ goto done;
+ }
+
+ switch (softc->state) {
+ case PMP_STATE_PORTS:
+ softc->pm_ports = (done_ccb->ataio.res.lba_high << 24) +
+ (done_ccb->ataio.res.lba_mid << 16) +
+ (done_ccb->ataio.res.lba_low << 8) +
+ done_ccb->ataio.res.sector_count;
+ /* This PM declares 6 ports, while only 5 of them are real.
+ * Port 5 is enclosure management bridge port, which has implementation
+ * problems, causing probe faults. Hide it for now. */
+ if (softc->pm_pid == 0x37261095 && softc->pm_ports == 6)
+ softc->pm_ports = 5;
+ /* This PM declares 7 ports, while only 5 of them are real.
+ * Port 5 is some fake "Config Disk" with 640 sectors size,
+ * port 6 is enclosure management bridge port.
+ * Both fake ports has implementation problems, causing
+ * probe faults. Hide them for now. */
+ 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);
- break;
+ xpt_schedule(periph, priority);
+ return;
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);
- 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);
- }
+ softc->pm_step = 0;
+ softc->state = PMP_STATE_RESET;
xpt_release_ccb(done_ccb);
- break;
+ xpt_schedule(periph, priority);
+ return;
case PMP_STATE_RESET:
- if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
- softc->pm_step++;
- if (softc->pm_step < softc->pm_ports) {
- xpt_release_ccb(done_ccb);
- xpt_schedule(periph, priority);
- return;
- } else {
- softc->pm_step = 0;
- DELAY(5000);
- printf("PM reset done\n");
- softc->state = PMP_STATE_CONNECT;
- 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);
+ softc->pm_step++;
+ if (softc->pm_step >= softc->pm_ports) {
+ softc->pm_step = 0;
+ DELAY(5000);
+ printf("PM reset done\n");
+ softc->state = PMP_STATE_CONNECT;
}
xpt_release_ccb(done_ccb);
- break;
+ xpt_schedule(periph, priority);
+ return;
case PMP_STATE_CONNECT:
- if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
- softc->pm_step++;
- if (softc->pm_step < softc->pm_ports) {
- xpt_release_ccb(done_ccb);
- xpt_schedule(periph, priority);
- return;
- } else {
- softc->pm_step = 0;
- softc->pm_try = 0;
- printf("PM connect done\n");
- softc->state = PMP_STATE_CHECK;
- 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);
+ softc->pm_step++;
+ if (softc->pm_step >= softc->pm_ports) {
+ softc->pm_step = 0;
+ softc->pm_try = 0;
+ printf("PM connect done\n");
+ softc->state = PMP_STATE_CHECK;
}
xpt_release_ccb(done_ccb);
- break;
+ xpt_schedule(periph, priority);
+ return;
case PMP_STATE_CHECK:
- if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
- int res = (done_ccb->ataio.res.lba_high << 24) +
- (done_ccb->ataio.res.lba_mid << 16) +
- (done_ccb->ataio.res.lba_low << 8) +
- done_ccb->ataio.res.sector_count;
- if ((res & 0xf0f) == 0x103 && (res & 0x0f0) != 0) {
+ res = (done_ccb->ataio.res.lba_high << 24) +
+ (done_ccb->ataio.res.lba_mid << 16) +
+ (done_ccb->ataio.res.lba_low << 8) +
+ done_ccb->ataio.res.sector_count;
+ if ((res & 0xf0f) == 0x103 && (res & 0x0f0) != 0) {
+ printf("PM status: %d - %08x\n", softc->pm_step, res);
+ softc->found |= (1 << softc->pm_step);
+ softc->pm_step++;
+ } else {
+ if (softc->pm_try < 100) {
+ DELAY(10000);
+ softc->pm_try++;
+ } else {
printf("PM status: %d - %08x\n", softc->pm_step, res);
- softc->found |= (1 << softc->pm_step);
+ softc->found &= ~(1 << softc->pm_step);
+ if (xpt_create_path(&dpath, periph,
+ done_ccb->ccb_h.path_id,
+ softc->pm_step, 0) == CAM_REQ_CMP) {
+ xpt_async(AC_LOST_DEVICE, dpath, NULL);
+ xpt_free_path(dpath);
+ }
softc->pm_step++;
- } else {
- if (softc->pm_try < 100) {
- DELAY(10000);
- softc->pm_try++;
- } else {
- printf("PM status: %d - %08x\n", softc->pm_step, res);
- softc->found &= ~(1 << softc->pm_step);
- if (xpt_create_path(&dpath, periph,
- done_ccb->ccb_h.path_id,
- softc->pm_step, 0) == CAM_REQ_CMP) {
- xpt_async(AC_LOST_DEVICE, dpath, NULL);
- xpt_free_path(dpath);
- }
- softc->pm_step++;
- }
}
- if (softc->pm_step < softc->pm_ports) {
- xpt_release_ccb(done_ccb);
- xpt_schedule(periph, priority);
- return;
- } else {
- softc->pm_step = 0;
- softc->state = PMP_STATE_CLEAR;
- xpt_release_ccb(done_ccb);
- xpt_schedule(periph, priority);
- return;
- }
- } else if (cam_periph_error(done_ccb, 0, 0,
- &softc->saved_ccb) == ERESTART) {
+ }
+ if (softc->pm_step < softc->pm_ports) {
+ xpt_release_ccb(done_ccb);
+ xpt_schedule(periph, priority);
+ return;
+ } else {
+ softc->pm_step = 0;
+ softc->state = PMP_STATE_CLEAR;
+ xpt_release_ccb(done_ccb);
+ xpt_schedule(periph, priority);
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_CLEAR:
- if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
- softc->pm_step++;
- if (softc->pm_step < softc->pm_ports) {
- xpt_release_ccb(done_ccb);
- xpt_schedule(periph, priority);
- return;
- } else if (softc->found) {
- softc->pm_step = 0;
- softc->state = PMP_STATE_SCAN;
- work_ccb = xpt_alloc_ccb_nowait();
- if (work_ccb != NULL)
- goto do_scan;
- xpt_release_ccb(done_ccb);
- }
- break;
- } else if (cam_periph_error(done_ccb, 0, 0,
- &softc->saved_ccb) == ERESTART) {
+ softc->pm_step++;
+ if (softc->pm_step < softc->pm_ports) {
+ xpt_release_ccb(done_ccb);
+ xpt_schedule(periph, priority);
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);
+ } else if (softc->found) {
+ softc->pm_step = 0;
+ softc->state = PMP_STATE_SCAN;
+ work_ccb = xpt_alloc_ccb_nowait();
+ if (work_ccb != NULL)
+ goto do_scan;
+ xpt_release_ccb(done_ccb);
}
- xpt_release_ccb(done_ccb);
break;
case PMP_STATE_SCAN:
work_ccb = done_ccb;
@@ -703,7 +632,6 @@
}
if (softc->pm_step >= softc->pm_ports) {
xpt_free_ccb(work_ccb);
- xpt_release_ccb(done_ccb);
break;
}
if (xpt_create_path(&dpath, periph,
@@ -712,7 +640,6 @@
printf("pmpdone: xpt_create_path failed"
", bus scan halted\n");
xpt_free_ccb(work_ccb);
- xpt_release_ccb(done_ccb);
break;
}
xpt_setup_ccb(&work_ccb->ccb_h, dpath,
@@ -727,6 +654,8 @@
default:
break;
}
+done:
+ xpt_release_ccb(done_ccb);
softc->state = PMP_STATE_NORMAL;
pmprelease(periph, -1);
cam_periph_release_locked(periph);
More information about the p4-projects
mailing list