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)
|