include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / message / fusion / mptfc.c
index c3c24fd..33f7256 100644 (file)
@@ -54,6 +54,7 @@
 #include <linux/reboot.h>      /* notifier code */
 #include <linux/workqueue.h>
 #include <linux/sort.h>
+#include <linux/slab.h>
 
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
@@ -195,29 +196,34 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
        unsigned long           flags;
        int                     ready;
        MPT_ADAPTER             *ioc;
+       int                     loops = 40;     /* seconds */
 
        hd = shost_priv(SCpnt->device->host);
        ioc = hd->ioc;
        spin_lock_irqsave(shost->host_lock, flags);
-       while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) {
+       while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY
+        || (loops > 0 && ioc->active == 0)) {
                spin_unlock_irqrestore(shost->host_lock, flags);
                dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
                        "mptfc_block_error_handler.%d: %d:%d, port status is "
-                       "DID_IMM_RETRY, deferring %s recovery.\n",
+                       "%x, active flag %d, deferring %s recovery.\n",
                        ioc->name, ioc->sh->host_no,
-                       SCpnt->device->id, SCpnt->device->lun, caller));
+                       SCpnt->device->id, SCpnt->device->lun,
+                       ready, ioc->active, caller));
                msleep(1000);
                spin_lock_irqsave(shost->host_lock, flags);
+               loops --;
        }
        spin_unlock_irqrestore(shost->host_lock, flags);
 
-       if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) {
+       if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata
+        || ioc->active == 0) {
                dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
                        "%s.%d: %d:%d, failing recovery, "
-                       "port state %d, vdevice %p.\n", caller,
+                       "port state %x, active %d, vdevice %p.\n", caller,
                        ioc->name, ioc->sh->host_no,
                        SCpnt->device->id, SCpnt->device->lun, ready,
-                       SCpnt->device->hostdata));
+                       ioc->active, SCpnt->device->hostdata));
                return FAILED;
        }
        dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
@@ -1251,17 +1257,15 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
         * A slightly different algorithm is required for
         * 64bit SGEs.
         */
-       scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
-       if (sizeof(dma_addr_t) == sizeof(u64)) {
+       scale = ioc->req_sz/ioc->SGE_size;
+       if (ioc->sg_addr_size == sizeof(u64)) {
                numSGE = (scale - 1) *
                  (ioc->facts.MaxChainDepth-1) + scale +
-                 (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
-                 sizeof(u32));
+                 (ioc->req_sz - 60) / ioc->SGE_size;
        } else {
                numSGE = 1 + (scale - 1) *
                  (ioc->facts.MaxChainDepth-1) + scale +
-                 (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
-                 sizeof(u32));
+                 (ioc->req_sz - 64) / ioc->SGE_size;
        }
 
        if (numSGE < sh->sg_tablesize) {
@@ -1290,30 +1294,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
                 ioc->name, ioc->ScsiLookup));
 
-       /* Clear the TM flags
-        */
-       hd->tmPending = 0;
-       hd->tmState = TM_STATE_NONE;
-       hd->resetPending = 0;
-       hd->abortSCpnt = NULL;
-
-       /* Clear the pointer used to store
-        * single-threaded commands, i.e., those
-        * issued during a bus scan, dv and
-        * configuration pages.
-        */
-       hd->cmdPtr = NULL;
-
-       /* Initialize this SCSI Hosts' timers
-        * To use, set the timer expires field
-        * and add_timer
-        */
-       init_timer(&hd->timer);
-       hd->timer.data = (unsigned long) hd;
-       hd->timer.function = mptscsih_timer_expired;
-
-       init_waitqueue_head(&hd->scandv_waitq);
-       hd->scandv_wait_done = 0;
        hd->last_queue_full = 0;
 
        sh->transportt = mptfc_transport_template;