PERFORCE change 164334 for review
Alexander Motin
mav at FreeBSD.org
Sun Jun 14 12:45:06 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=164334
Change 164334 by mav at mav_mavbook on 2009/06/14 12:44:53
On hard reset requeue all running/pending commands.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#29 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#29 (text+ko) ====
@@ -69,7 +69,6 @@
static void ahci_execute_transaction(struct ahci_slot *slot);
static void ahci_timeout(struct ahci_slot *slot);
static void ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et);
-static int ahci_hardreset(device_t dev);
static int ahci_setup_fis(struct ahci_cmd_tab *ctp, union ccb *ccb, int tag);
static void ahci_dmainit(device_t dev);
static void ahci_dmasetupc_cb(void *xsc, bus_dma_segment_t *segs, int nsegs, int error);
@@ -1128,30 +1127,9 @@
{
device_t dev = slot->dev;
struct ahci_channel *ch = device_get_softc(dev);
- enum ahci_err_type et;
- int i;
device_printf(dev, "Timeout on slot %d\n", slot->slot);
- /* Requeue freezed command. */
- if (ch->frozen) {
- union ccb *fccb = ch->frozen;
- ch->frozen = NULL;
- xpt_release_simq(ch->sim, TRUE);
- fccb->ccb_h.status = CAM_SCSI_BUS_RESET;
- xpt_done(fccb);
- }
- /* Kill the engine and terminate all commands. */
- ahci_stop(dev);
- for (i = 0; i < ch->numslots; i++) {
- /* Do we have a running request on slot? */
- if (ch->slot[i].state < AHCI_SLOT_RUNNING)
- continue;
- if (i == slot->slot)
- et = AHCI_ERR_TIMEOUT;
- else
- et = AHCI_ERR_RESET;
- ahci_end_transaction(&ch->slot[i], et);
- }
+ ahci_end_transaction(&ch->slot[slot->slot], AHCI_ERR_TIMEOUT);
/* XXX: This is wrong for NCQ error recovery. */
ahci_reset(dev);
}
@@ -1376,35 +1354,34 @@
return (0);
}
-static int
-ahci_hardreset(device_t dev)
-{
-
- ahci_stop(dev);
- /* Reset port */
- if (!ahci_sata_phy_reset(dev, 0))
- return (ENOENT);
- /* Wait for clearing busy status. */
- if (ahci_wait_ready(dev, 10000)) {
- device_printf(dev, "device ready timeout\n");
- ahci_clo(dev);
- }
- ahci_start(dev);
- return (0);
-}
-
static void
ahci_reset(device_t dev)
{
struct ahci_channel *ch = device_get_softc(dev);
+ int i;
if (bootverbose)
device_printf(dev, "AHCI reset...\n");
-
+ /* Requeue freezed command. */
+ if (ch->frozen) {
+ union ccb *fccb = ch->frozen;
+ ch->frozen = NULL;
+ xpt_release_simq(ch->sim, TRUE);
+ fccb->ccb_h.status = CAM_SCSI_BUS_RESET;
+ xpt_done(fccb);
+ }
+ /* Kill the engine and requeue all running commands. */
+ ahci_stop(dev);
+ for (i = 0; i < ch->numslots; i++) {
+ /* Do we have a running request on slot? */
+ if (ch->slot[i].state < AHCI_SLOT_RUNNING)
+ continue;
+ ahci_end_transaction(&ch->slot[i], AHCI_ERR_RESET);
+ }
/* Disable port interrupts */
ATA_OUTL(ch->r_mem, AHCI_P_IE, 0);
/* Reset and reconnect PHY, */
- if (ahci_hardreset(dev)) {
+ if (!ahci_sata_phy_reset(dev, 0)) {
if (bootverbose)
device_printf(dev,
"AHCI reset done: phy reset found no device\n");
@@ -1414,6 +1391,12 @@
(AHCI_P_IX_CPD | AHCI_P_IX_PRC | AHCI_P_IX_PC));
return;
}
+ /* Wait for clearing busy status. */
+ if (ahci_wait_ready(dev, 10000)) {
+ device_printf(dev, "device ready timeout\n");
+ ahci_clo(dev);
+ }
+ ahci_start(dev);
ch->devices = 1;
/* Enable wanted port interrupts */
ATA_OUTL(ch->r_mem, AHCI_P_IE,
@@ -1424,9 +1407,8 @@
AHCI_P_IX_DS | AHCI_P_IX_PS | AHCI_P_IX_DHR));
if (bootverbose)
device_printf(dev, "AHCI reset done: devices=%08x\n", ch->devices);
- /* If we've attached to the XPT, tell it about the event */
- if (ch->path != NULL)
- xpt_async(AC_BUS_RESET, ch->path, NULL);
+ /* Tell the XPT about the event */
+ xpt_async(AC_BUS_RESET, ch->path, NULL);
}
static int
More information about the p4-projects
mailing list