linux-origin
[Top] [All Lists]

Qlogicfc driver

To: linux-origin@xxxxxxxxxxx
Subject: Qlogicfc driver
From: Ralf Baechle <ralf@xxxxxxxxxxxxxx>
Date: Mon, 19 Jun 2000 18:53:38 +0200
Sender: owner-linux-origin@xxxxxxxxxxx
Currently we've got below patch for the qlogicfc driver in the CVS.
Could whoever is responsible for this drivers either

 - submit it to the maintainer
 - tell me that this patch is ok to submit to Linus

Thanks,

  Ralf

diff -urN --exclude=CVS --exclude=.cvsignore 
linux-2.4.0-test1-ac21/drivers/scsi/qlogicfc.c linux-sgi/drivers/scsi/qlogicfc.c
--- linux-2.4.0-test1-ac21/drivers/scsi/qlogicfc.c      Mon Jun 19 03:13:49 2000
+++ linux-sgi/drivers/scsi/qlogicfc.c   Mon Jun 19 15:40:18 2000
@@ -72,12 +72,21 @@
 #define pci64_map_sg(d,s,n,dir) pci_map_sg((d),(s),(n),(dir))
 #define pci64_unmap_single(d,a,s,dir) pci_unmap_single((d),(a),(s),(dir))
 #define pci64_unmap_sg(d,s,n,dir) pci_unmap_sg((d),(s),(n),(dir))
+#if BITS_PER_LONG > 32
+#define pci64_dma_hi32(a) ((u32) (0xffffffff & (a>>32)))
+#define pci64_dma_lo32(a) ((u32) (0xffffffff & (a)))
+#else
 #define pci64_dma_hi32(a) 0
 #define pci64_dma_lo32(a) (a)
+#endif /* BITS_PER_LONG */
 #define pci64_dma_build(hi,lo) (lo)
 #define sg_dma64_address(s) sg_dma_address(s)
 #define sg_dma64_len(s) sg_dma_len(s)
+#if BITS_PER_LONG > 32
+#define PCI64_DMA_BITS 64
+#else
 #define PCI64_DMA_BITS 32
+#endif         /* BITS_PER_LONG */
 #endif
 
 #include "qlogicfc.h"
@@ -101,15 +110,12 @@
 #define ISP2x00_FABRIC          1
 
 /*  Macros used for debugging */
-/*
-#define DEBUG_ISP2x00          1
-#define DEBUG_ISP2x00_INT      1
-#define DEBUG_ISP2x00_INTR     1
-#define DEBUG_ISP2x00_SETUP    1
-
-#define DEBUG_ISP2x00_FABRIC    1
-*/
-/* #define TRACE_ISP             1 */
+#define DEBUG_ISP2x00          0
+#define DEBUG_ISP2x00_INT      0
+#define DEBUG_ISP2x00_INTR     0
+#define DEBUG_ISP2x00_SETUP    0
+#define DEBUG_ISP2x00_FABRIC    0
+#define TRACE_ISP              0 
 
 
 #define DEFAULT_LOOP_COUNT     1000000000
@@ -1233,7 +1239,7 @@
        for (i = in_ptr; i != (in_ptr - 1) && hostdata->handle_ptrs[i]; i = ((i 
+ 1) % (QLOGICFC_REQ_QUEUE_LEN + 1)));
 
        if (!hostdata->handle_ptrs[i]) {
-               cmd->handle = i;
+               cmd->handle = cpu_to_le32(i);
                hostdata->handle_ptrs[i] = Cmnd;
                hostdata->handle_serials[i] = Cmnd->serial_number;
        } else {
@@ -1358,6 +1364,13 @@
                                break;
                }
        }
+       /*
+        * TEST_UNIT_READY commands from scsi_scan will fail due to "overlapped
+        * commands attempted" unless we setup at least a simple queue 
(midlayer 
+        * will embelish this once it can do an INQUIRY command to the device)
+        */
+       else
+               cmd->control_flags |= cpu_to_le16(CFLAG_SIMPLE_TAG);
        outw(in_ptr, host->io_port + MBOX4);
        hostdata->req_in_ptr = in_ptr;
 
@@ -1541,12 +1554,14 @@
                DEBUG_INTR(printk("qlogicfc%d : response queue depth %d\n", 
hostdata->host_id, RES_QUEUE_DEPTH(in_ptr, out_ptr)));
 
                while (out_ptr != in_ptr) {
+                       unsigned le_hand;
                        sts = (struct Status_Entry *) 
&hostdata->res[out_ptr*QUEUE_ENTRY_LEN];
                        out_ptr = (out_ptr + 1) & RES_QUEUE_LEN;
                  
                        TRACE("done", out_ptr, Cmnd);
                        DEBUG_INTR(isp2x00_print_status_entry(sts));
-                       if (sts->hdr.entry_type == ENTRY_STATUS && (Cmnd = 
hostdata->handle_ptrs[sts->handle])) {
+                       le_hand = le32_to_cpu(sts->handle);
+                       if (sts->hdr.entry_type == ENTRY_STATUS && (Cmnd = 
hostdata->handle_ptrs[le_hand])) {
                                Cmnd->result = isp2x00_return_status(Cmnd, sts);
                                hostdata->queued--;
 
@@ -1565,10 +1580,10 @@
                                 * we dont have to call done because the upper
                                 * level should already know its aborted.
                                 */
-                               if (hostdata->handle_serials[sts->handle] != 
Cmnd->serial_number 
+                               if (hostdata->handle_serials[le_hand] != 
Cmnd->serial_number 
                                    || le16_to_cpu(sts->completion_status) == 
CS_ABORTED){
-                                       hostdata->handle_serials[sts->handle] = 
0;
-                                       hostdata->handle_ptrs[sts->handle] = 
NULL;
+                                       hostdata->handle_serials[le_hand] = 0;
+                                       hostdata->handle_ptrs[le_hand] = NULL;
                                        outw(out_ptr, host->io_port + MBOX5);
                                        continue;
                                }
@@ -1589,7 +1604,7 @@
                                continue;
                        }
 
-                       hostdata->handle_ptrs[sts->handle] = NULL;
+                       hostdata->handle_ptrs[le_hand] = NULL;
 
                        if (sts->completion_status == 
cpu_to_le16(CS_RESET_OCCURRED)
                            || (sts->status_flags & cpu_to_le16(STF_BUS_RESET)))
@@ -1912,23 +1927,14 @@
        }
 #endif
 
-#ifdef __BIG_ENDIAN
-       {
-               u64 val;
-               memcpy(&val, &hostdata->control_block.node_name, sizeof(u64));
-               hostdata->wwn = ((val & 0xff00ff00ff00ff00ULL) >> 8)
-                             | ((val & 0x00ff00ff00ff00ffULL) << 8);
-       }
-#else
-       hostdata->wwn = (u64) (hostdata->control_block.node_name[0]) << 56;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[0] & 0xff00) 
<< 48;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[1] & 0xff00) 
<< 24;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[1] & 0x00ff) 
<< 48;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[2] & 0x00ff) 
<< 24;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[2] & 0xff00) 
<< 8;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[3] & 0x00ff) 
<< 8;
-       hostdata->wwn |= (u64) (hostdata->control_block.node_name[3] & 0xff00) 
>> 8;
-#endif
+       hostdata->wwn = (u64) 
(cpu_to_le16(hostdata->control_block.node_name[0])) << 56;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[0]) & 0xff00) << 48;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[1]) & 0xff00) << 24;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[1]) & 0x00ff) << 48;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[2]) & 0x00ff) << 24;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[2]) & 0xff00) << 8;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[3]) & 0x00ff) << 8;
+       hostdata->wwn |= (u64) 
(cpu_to_le16(hostdata->control_block.node_name[3]) & 0xff00) >> 8;
 
        /* FIXME: If the DMA transfer goes one way only, this should use 
PCI_DMA_TODEVICE and below as well. */
        busaddr = pci64_map_single(hostdata->pci_dev, &hostdata->control_block, 
sizeof(hostdata->control_block),
diff -urN --exclude=CVS --exclude=.cvsignore 
linux-2.4.0-test1-ac21/drivers/scsi/qlogicfc.h linux-sgi/drivers/scsi/qlogicfc.h
--- linux-2.4.0-test1-ac21/drivers/scsi/qlogicfc.h      Wed Feb 23 22:37:35 2000
+++ linux-sgi/drivers/scsi/qlogicfc.h   Fri Mar 31 03:50:09 2000
@@ -62,7 +62,7 @@
  * determined for each queue request anew.
  */
 
-#if PCI64_DMA_BITS > 32
+#if BITS_PER_LONG > 32
 #define DATASEGS_PER_COMMAND 2
 #define DATASEGS_PER_CONT 5
 #else

<Prev in Thread] Current Thread [Next in Thread>