linux-origin
[Top] [All Lists]

Re: Qlogicfc driver

To: Ralf Baechle <ralf@xxxxxxxxxxxxxx>, linux-origin@xxxxxxxxxxx
Subject: Re: Qlogicfc driver
From: "Leo Dagum" <dagum@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 19 Jun 2000 14:15:29 -0700
In-reply-to: Ralf Baechle <ralf@xxxxxxxxxxxxxx> "Qlogicfc driver" (Jun 19, 6:53pm)
References: <20000619185338.A8852@xxxxxxxxxxxxxxxx>
Sender: owner-linux-origin@xxxxxxxxxxx
On Jun 19,  6:53pm, Ralf Baechle wrote:
> Subject: Qlogicfc driver
> 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

Yes, please submit it to Linus.  I tried a couple times but got
ignored.  Without this patch qlogicfc simply will not work (on
*any* machine, not just mips64.)

Thanks,

- leo

>
> 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
>-- End of excerpt from Ralf Baechle



-- 
Leo Dagum    SGI  Mountain View, CA 94043 (650-933-2179)

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