On Fri, 2005-08-05 at 02:11 -0700, [EMAIL PROTECTED] wrote:

> +/************************************/
> +#if defined __KERNEL__

this looks wrong; __KERNEL__ is always set

> +#include <linux/config.h>


> +#if defined( CONFIG_MODVERSIONS ) && ! defined( MODVERSIONS )
> +#define MODVERSIONS
> +#endif
> +     /* modversions.h should be before should be before module.h */
> +#if defined( MODVERSIONS )
> +#include <config/modversions.h>
> +#endif

please remove this entire chunk; module.h will do this already for you,
and it's just plain WRONG to do it yourself on 2.6



> +#include <linux/module.h>
> +#include <linux/version.h>
> +     /* Now your module include files & source code follows */
> +#include <asm/dma.h>
> +#include <asm/io.h>
> +#include <asm/system.h>
> +#include <asm/uaccess.h>

it's common practice to sort the includes such that the asm/ ones come
after the linux/ ones


> +static u_int8_t arcmsr_adapterCnt = 0;
> +static struct _HCBARC arcmsr_host_control_block;
> +static PHCBARC pHCBARC = &arcmsr_host_control_block;


this looks like an evil typedef; please use struct hcbarc consistently,
and do not use the P convention to typedef pointers!

> +/*
> +**********************************************************************************
> +** notifier block to get a notify on system shutdown/halt/reboot
> +**********************************************************************************
> +*/

this comment looks misplaced

> +static int arcmsr_fops_ioctl(struct inode *inode, struct file *filep,
> +                          unsigned int ioctl_cmd, unsigned long arg);
> +static int arcmsr_fops_close(struct inode *inode, struct file *filep);
> +static int arcmsr_fops_open(struct inode *inode, struct file *filep);
> +static int arcmsr_halt_notify(struct notifier_block *nb, unsigned long event,
> +                           void *buf);
> +static int arcmsr_initialize(PACB pACB, struct pci_dev *pPCI_DEV);
> +static int arcmsr_iop_ioctlcmd(PACB pACB, int ioctl_cmd, void *arg);
> +static int arcmsr_proc_info(struct Scsi_Host *host, char *buffer, char 
> **start,
> +                         off_t offset, int length, int inout);


> +     .use_clustering = DISABLE_CLUSTERING,

why this?


> +static irqreturn_t arcmsr_doInterrupt(int irq, void *dev_id,
> +                                   struct pt_regs *regs)
> +{
> +     irqreturn_t handle_state;
> +     PACB pACB, pACBtmp;
> +     int i = 0;
> +
> +#if ARCMSR_DEBUG0
> +     printk("arcmsr_doInterrupt.................. 1\n");
> +#endif


please use pr_debug for this, that way you can get rid of all the #if's



> +     }
> +     if (!pci_set_dma_mask(pPCI_DEV, (dma_addr_t) 0xffffffffffffffffULL)) {  
> /*64bit */
> +             printk("ARECA RAID: 64BITS PCI BUS DMA ADDRESSING SUPPORTED\n");
> +     } else if (pci_set_dma_mask(pPCI_DEV, (dma_addr_t) 
> 0x00000000ffffffffULL)) {    /*32bit */


there are nice symbolic constants for these, please use them 





> +
> +/*
> +**********************************************************************
> +**
> +**  Linux scsi mid layer command complete
> +**
> +**********************************************************************
> +*/
> +static void arcmsr_cmd_done(struct scsi_cmnd *pcmd)
> +{
> +     pcmd->scsi_done(pcmd);
> +     return;
> +}

why this abstraction?


> +
> +/*
> +************************************************************************
> +**
> +**
> +************************************************************************
> +*/
> +static void arcmsr_flush_adapter_cache(PACB pACB)
> +{
> +#if ARCMSR_DEBUG0
> +     printk("arcmsr_flush_adapter_cache..............\n");
> +#endif
> +     CHIP_REG_WRITE32(&pACB->pmu->inbound_msgaddr0,
> +                      ARCMSR_INBOUND_MESG0_FLUSH_CACHE);


you probably want to take care of PCI posting on this one

> +     while (1) {
> +             if (pACB->pccbwait2go[i] == NULL) {
> +                     pACB->pccbwait2go[i] = pCCB;
> +                     atomic_inc(&pACB->ccbwait2gocount);
> +                     spin_unlock_irqrestore(&pACB->wait2go_lockunlock, flag);
> +                     return;
> +             }
> +             i++;
> +             i %= ARCMSR_MAX_OUTSTANDING_CMD;
> +     }

hmmmm this looks like a really long busy wait potentially.. especially
since irq's are off and the adapter can't send you any completion
interrupts

> +static u_int8_t arcmsr_wait_msgint_ready(PACB pACB)
> +{
> +     uint32_t Index;
> +     uint8_t Retries = 0x00;
> +     do {
> +             for (Index = 0; Index < 500000; Index++) {
> +                     if (CHIP_REG_READ32(&pACB->pmu->outbound_intstatus) &
> +                         ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
> +                             
> CHIP_REG_WRITE32(&pACB->pmu->outbound_intstatus, 
> ARCMSR_MU_OUTBOUND_MESSAGE0_INT);      /*clear interrupt */
> +                             return 0x00;
> +                     }
> +                     /* one us delay */
> +                     udelay(10);
> +             }               /*max 5 seconds */

5 seconds of busy waiting is really really not nimce


> +     } while (Retries++ < 24);       /*max 2 minutes */

eh wait make that 2 minutes!



> +
> +                             while (1) {
> +                                     int64_t span4G, length0;
> +                                     PSG64ENTRY pdma_sg = (PSG64ENTRY) psge;
> +
> +                                     span4G =
> +                                         (int64_t) address_lo + tmplength;
> +                                     pdma_sg->addresshigh = address_hi;
> +                                     pdma_sg->address = address_lo;
> +                                     if (span4G > 0x100000000ULL) {
> +                                             /*see if cross 4G boundary */

the linux block layer will guarantee that that doesn't happen afaik


> +     rc = pci_set_dma_mask(pPCI_DEV, (dma_addr_t) 0x00000000ffffffffULL);    
> /*32bit */


> +     /* Attempt to claim larger area for request queue pCCB). */
> +     dma_coherent =
> +         dma_alloc_coherent(&pPCI_DEV->dev,
> +                            ARCMSR_MAX_FREECCB_NUM * sizeof(struct _CCB) +
> +                            0x20, &dma_coherent_handle, GFP_KERNEL);
...
> +     rc = pci_set_dma_mask(pPCI_DEV, (dma_addr_t) 0xffffffffffffffffULL);    
> /*set dma 64bit again if could */


this is wrong! For this purpose there is a DIFFERENT mask that needs setting, 
and then you are guarenteed that all coherent allocations are 32
bit, no need to fiddle with the async pci mask at all




> +
> +#if defined(__SMP__) && !defined(CONFIG_SMP)
> +# define CONFIG_SMP
> +#endif

this is wrong; __SMP__ doesn't exist, nor should your driver care.


> +/*
> +*********************************************************************
> +*/
> +#if BITS_PER_LONG == 64
> +typedef uint64_t CPT2INT, *PCPT2INT;
> +#else
> +typedef uint32_t CPT2INT, *PCPT2INT;
> +#endif

this is very suspect and most likely wrong. You don't want to use this.


> +**********************************************************************************
> +*/
> +#define CHIP_REG_READ8(a)                                
> (uint8_t)(readb((uint8_t *)(a)))
> +#define CHIP_REG_READ16(a)                              
> (uint16_t)(readw((uint16_t *)(a)))
> +#define CHIP_REG_READ32(a)                              
> (uint32_t)(readl((uint32_t *)(a)))
> +#define CHIP_REG_WRITE8(a,d)                        
> writeb((uint8_t)(d),(uint8_t *)(a))
> +#define CHIP_REG_WRITE16(a,d)                               
> writew((uint16_t)(d),(uint16_t *)(a))
> +#define CHIP_REG_WRITE32(a,d)                           
> writel((uint32_t)(d),(uint32_t *)(a))

why these trivial abstractions ?

> +#define PCIVendorIDARECA                                             0x17D3  
> /* Vendor ID    */
> +#define PCIDeviceIDARC1110                                           0x1110  
> /* Device ID    */
> +#define PCIDeviceIDARC1120                                           0x1120  
> /* Device ID        */
> +#define PCIDeviceIDARC1130                                           0x1130  
> /* Device ID        */
> +#define PCIDeviceIDARC1160                                           0x1160  
> /* Device ID        */
> +#define PCIDeviceIDARC1170                                           0x1170  
> /* Device ID        */
> +#define PCIDeviceIDARC1210                                           0x1210  
> /* Device ID    */
> +#define PCIDeviceIDARC1220                                           0x1220  
> /* Device ID        */
> +#define PCIDeviceIDARC1230                                           0x1230  
> /* Device ID        */
> +#define PCIDeviceIDARC1260                                           0x1260  
> /* Device ID        */
> +#define PCIDeviceIDARC1270                                           0x1270  
> /* Device ID        */

these need to go into the global pci id header
> +/*
> +**********************************************************************************
> +**
> +**********************************************************************************
> +*/
> +#define dma_addr_hi32(a)           ((uint32_t) (0xffffffff & 
> (((uint64_t)(a))>>32)))

it is better to do ((a>> 16)>>16) for this; that way it's always defined C and 
you need less casts and other magic

> +*********************************************************************
> +**                 Adapter Control Block
> +**
> +*********************************************************************
> +*/
> +typedef struct _ACB {
> +     struct pci_dev *pPCI_DEV;
> +     struct Scsi_Host *pScsiHost;
> +#if BITS_PER_LONG == 64
> +     uint64_t vir2phy_offset;        /* Offset is used in making arc cdb 
> physical to virtual calculations */
> +#else
> +     uint32_t vir2phy_offset;        /* Offset is used in making arc cdb 
> physical to virtual calculations */
> +#endif

then... why not use a long ???




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to