2005-04-17 02:20:36 +04:00
/* -*- mode: c; c-basic-offset: 8 -*- */
/* PARISC LASI driver for the 53c700 chip
*
* Copyright ( C ) 2001 by James . Bottomley @ HansenPartnership . com
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* *
* * This program is free software ; you can redistribute it and / or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation ; either version 2 of the License , or
* * ( at your option ) any later version .
* *
* * This program is distributed in the hope that it will be useful ,
* * but WITHOUT ANY WARRANTY ; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* * GNU General Public License for more details .
* *
* * You should have received a copy of the GNU General Public License
* * along with this program ; if not , write to the Free Software
* * Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
* *
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/*
* Many thanks to Richard Hirst < rhirst @ linuxcare . com > for patiently
* debugging this driver on the parisc architecture and suggesting
* many improvements and bug fixes .
*
* Thanks also go to Linuxcare Inc . for providing several PARISC
* machines for me to debug the driver on .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/init.h>
# include <linux/types.h>
# include <linux/stat.h>
# include <linux/mm.h>
# include <linux/blkdev.h>
# include <linux/ioport.h>
# include <linux/dma-mapping.h>
# include <asm/page.h>
# include <asm/pgtable.h>
# include <asm/irq.h>
# include <asm/hardware.h>
# include <asm/parisc-device.h>
# include <asm/delay.h>
# include <scsi/scsi_host.h>
# include <scsi/scsi_device.h>
# include <scsi/scsi_transport.h>
# include <scsi/scsi_transport_spi.h>
# include "53c700.h"
MODULE_AUTHOR ( " James Bottomley " ) ;
MODULE_DESCRIPTION ( " lasi700 SCSI Driver " ) ;
MODULE_LICENSE ( " GPL " ) ;
# define LASI_700_SVERSION 0x00071
# define LASI_710_SVERSION 0x00082
# define LASI700_ID_TABLE { \
. hw_type = HPHW_FIO , \
. sversion = LASI_700_SVERSION , \
. hversion = HVERSION_ANY_ID , \
. hversion_rev = HVERSION_REV_ANY_ID , \
}
# define LASI710_ID_TABLE { \
. hw_type = HPHW_FIO , \
. sversion = LASI_710_SVERSION , \
. hversion = HVERSION_ANY_ID , \
. hversion_rev = HVERSION_REV_ANY_ID , \
}
# define LASI700_CLOCK 25
# define LASI710_CLOCK 40
# define LASI_SCSI_CORE_OFFSET 0x100
static struct parisc_device_id lasi700_ids [ ] = {
LASI700_ID_TABLE ,
LASI710_ID_TABLE ,
{ 0 }
} ;
static struct scsi_host_template lasi700_template = {
. name = " LASI SCSI 53c700 " ,
. proc_name = " lasi700 " ,
. this_id = 7 ,
. module = THIS_MODULE ,
} ;
MODULE_DEVICE_TABLE ( parisc , lasi700_ids ) ;
static int __init
lasi700_probe ( struct parisc_device * dev )
{
2005-10-22 06:36:40 +04:00
unsigned long base = dev - > hpa . start + LASI_SCSI_CORE_OFFSET ;
2005-04-17 02:20:36 +04:00
struct NCR_700_Host_Parameters * hostdata ;
struct Scsi_Host * host ;
some kmalloc/memset ->kzalloc (tree wide)
Transform some calls to kmalloc/memset to a single kzalloc (or kcalloc).
Here is a short excerpt of the semantic patch performing
this transformation:
@@
type T2;
expression x;
identifier f,fld;
expression E;
expression E1,E2;
expression e1,e2,e3,y;
statement S;
@@
x =
- kmalloc
+ kzalloc
(E1,E2)
... when != \(x->fld=E;\|y=f(...,x,...);\|f(...,x,...);\|x=E;\|while(...) S\|for(e1;e2;e3) S\)
- memset((T2)x,0,E1);
@@
expression E1,E2,E3;
@@
- kzalloc(E1 * E2,E3)
+ kcalloc(E1,E2,E3)
[akpm@linux-foundation.org: get kcalloc args the right way around]
Signed-off-by: Yoann Padioleau <padator@wanadoo.fr>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Acked-by: Russell King <rmk@arm.linux.org.uk>
Cc: Bryan Wu <bryan.wu@analog.com>
Acked-by: Jiri Slaby <jirislaby@gmail.com>
Cc: Dave Airlie <airlied@linux.ie>
Acked-by: Roland Dreier <rolandd@cisco.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Acked-by: Dmitry Torokhov <dtor@mail.ru>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Acked-by: Pierre Ossman <drzeus-list@drzeus.cx>
Cc: Jeff Garzik <jeff@garzik.org>
Cc: "David S. Miller" <davem@davemloft.net>
Acked-by: Greg KH <greg@kroah.com>
Cc: James Bottomley <James.Bottomley@steeleye.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-19 12:49:03 +04:00
hostdata = kzalloc ( sizeof ( * hostdata ) , GFP_KERNEL ) ;
2005-04-17 02:20:36 +04:00
if ( ! hostdata ) {
2009-01-13 23:14:51 +03:00
dev_printk ( KERN_ERR , & dev - > dev , " Failed to allocate host data \n " ) ;
2005-04-17 02:20:36 +04:00
return - ENOMEM ;
}
hostdata - > dev = & dev - > dev ;
dma_set_mask ( & dev - > dev , DMA_32BIT_MASK ) ;
2006-03-27 23:52:15 +04:00
hostdata - > base = ioremap_nocache ( base , 0x100 ) ;
2005-04-17 02:20:36 +04:00
hostdata - > differential = 0 ;
if ( dev - > id . sversion = = LASI_700_SVERSION ) {
hostdata - > clock = LASI700_CLOCK ;
hostdata - > force_le_on_be = 1 ;
} else {
hostdata - > clock = LASI710_CLOCK ;
hostdata - > force_le_on_be = 0 ;
hostdata - > chip710 = 1 ;
hostdata - > dmode_extra = DMODE_FC2 ;
2006-12-25 23:30:08 +03:00
hostdata - > burst_length = 8 ;
2005-04-17 02:20:36 +04:00
}
host = NCR_700_detect ( & lasi700_template , hostdata , & dev - > dev ) ;
if ( ! host )
goto out_kfree ;
host - > this_id = 7 ;
2005-04-03 13:57:48 +04:00
host - > base = base ;
2005-04-17 02:20:36 +04:00
host - > irq = dev - > irq ;
2006-07-02 06:29:42 +04:00
if ( request_irq ( dev - > irq , NCR_700_intr , IRQF_SHARED , " lasi700 " , host ) ) {
2005-04-17 02:20:36 +04:00
printk ( KERN_ERR " lasi700: request_irq failed! \n " ) ;
goto out_put_host ;
}
dev_set_drvdata ( & dev - > dev , host ) ;
scsi_scan_host ( host ) ;
return 0 ;
out_put_host :
scsi_host_put ( host ) ;
out_kfree :
iounmap ( hostdata - > base ) ;
kfree ( hostdata ) ;
return - ENODEV ;
}
static int __exit
lasi700_driver_remove ( struct parisc_device * dev )
{
struct Scsi_Host * host = dev_get_drvdata ( & dev - > dev ) ;
struct NCR_700_Host_Parameters * hostdata =
( struct NCR_700_Host_Parameters * ) host - > hostdata [ 0 ] ;
scsi_remove_host ( host ) ;
NCR_700_release ( host ) ;
free_irq ( host - > irq , host ) ;
iounmap ( hostdata - > base ) ;
kfree ( hostdata ) ;
return 0 ;
}
static struct parisc_driver lasi700_driver = {
2005-10-22 06:36:23 +04:00
. name = " lasi_scsi " ,
2005-04-17 02:20:36 +04:00
. id_table = lasi700_ids ,
. probe = lasi700_probe ,
. remove = __devexit_p ( lasi700_driver_remove ) ,
} ;
static int __init
lasi700_init ( void )
{
return register_parisc_driver ( & lasi700_driver ) ;
}
static void __exit
lasi700_exit ( void )
{
unregister_parisc_driver ( & lasi700_driver ) ;
}
module_init ( lasi700_init ) ;
module_exit ( lasi700_exit ) ;