Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/scsi/pcmcia/qlogic_stub.c (Version 2.6.25) and /linux/drivers/scsi/pcmcia/qlogic_stub.c (Version 2.6.11.8)


  1 /*============================================      1 /*======================================================================
  2                                                     2 
  3     A driver for the Qlogic SCSI card               3     A driver for the Qlogic SCSI card
  4                                                     4 
  5     qlogic_cs.c 1.79 2000/06/12 21:27:26            5     qlogic_cs.c 1.79 2000/06/12 21:27:26
  6                                                     6 
  7     The contents of this file are subject to t      7     The contents of this file are subject to the Mozilla Public
  8     License Version 1.1 (the "License"); you m      8     License Version 1.1 (the "License"); you may not use this file
  9     except in compliance with the License. You      9     except in compliance with the License. You may obtain a copy of
 10     the License at http://www.mozilla.org/MPL/     10     the License at http://www.mozilla.org/MPL/
 11                                                    11 
 12     Software distributed under the License is      12     Software distributed under the License is distributed on an "AS
 13     IS" basis, WITHOUT WARRANTY OF ANY KIND, e     13     IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 14     implied. See the License for the specific      14     implied. See the License for the specific language governing
 15     rights and limitations under the License.      15     rights and limitations under the License.
 16                                                    16 
 17     The initial developer of the original code     17     The initial developer of the original code is David A. Hinds
 18     <dahinds@users.sourceforge.net>.  Portions     18     <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
 19     are Copyright (C) 1999 David A. Hinds.  Al     19     are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
 20                                                    20 
 21     Alternatively, the contents of this file m     21     Alternatively, the contents of this file may be used under the
 22     terms of the GNU General Public License ve     22     terms of the GNU General Public License version 2 (the "GPL"), in which
 23     case the provisions of the GPL are applica     23     case the provisions of the GPL are applicable instead of the
 24     above.  If you wish to allow the use of yo     24     above.  If you wish to allow the use of your version of this file
 25     only under the terms of the GPL and not to     25     only under the terms of the GPL and not to allow others to use
 26     your version of this file under the MPL, i     26     your version of this file under the MPL, indicate your decision
 27     by deleting the provisions above and repla     27     by deleting the provisions above and replace them with the notice
 28     and other provisions required by the GPL.      28     and other provisions required by the GPL.  If you do not delete
 29     the provisions above, a recipient may use      29     the provisions above, a recipient may use your version of this
 30     file under either the MPL or the GPL.          30     file under either the MPL or the GPL.
 31                                                    31     
 32 ==============================================     32 ======================================================================*/
 33                                                    33 
 34 #include <linux/module.h>                          34 #include <linux/module.h>
 35 #include <linux/init.h>                            35 #include <linux/init.h>
 36 #include <linux/kernel.h>                          36 #include <linux/kernel.h>
                                                   >>  37 #include <linux/sched.h>
 37 #include <linux/slab.h>                            38 #include <linux/slab.h>
 38 #include <linux/string.h>                          39 #include <linux/string.h>
 39 #include <linux/ioport.h>                          40 #include <linux/ioport.h>
 40 #include <asm/io.h>                                41 #include <asm/io.h>
 41 #include <scsi/scsi.h>                             42 #include <scsi/scsi.h>
 42 #include <linux/major.h>                           43 #include <linux/major.h>
 43 #include <linux/blkdev.h>                          44 #include <linux/blkdev.h>
 44 #include <scsi/scsi_ioctl.h>                       45 #include <scsi/scsi_ioctl.h>
 45 #include <linux/interrupt.h>                       46 #include <linux/interrupt.h>
 46                                                    47 
 47 #include "scsi.h"                                  48 #include "scsi.h"
 48 #include <scsi/scsi_host.h>                        49 #include <scsi/scsi_host.h>
 49 #include "../qlogicfas408.h"                       50 #include "../qlogicfas408.h"
 50                                                    51 
                                                   >>  52 #include <pcmcia/version.h>
 51 #include <pcmcia/cs_types.h>                       53 #include <pcmcia/cs_types.h>
 52 #include <pcmcia/cs.h>                             54 #include <pcmcia/cs.h>
 53 #include <pcmcia/cistpl.h>                         55 #include <pcmcia/cistpl.h>
 54 #include <pcmcia/ds.h>                             56 #include <pcmcia/ds.h>
 55 #include <pcmcia/ciscode.h>                        57 #include <pcmcia/ciscode.h>
 56                                                    58 
 57 /* Set the following to 2 to use normal interr     59 /* Set the following to 2 to use normal interrupt (active high/totempole-
 58  * tristate), otherwise use 0 (REQUIRED FOR PC     60  * tristate), otherwise use 0 (REQUIRED FOR PCMCIA) for active low, open
 59  * drain                                           61  * drain
 60  */                                                62  */
 61 #define INT_TYPE        0                          63 #define INT_TYPE        0
 62                                                    64 
 63 static char qlogic_name[] = "qlogic_cs";           65 static char qlogic_name[] = "qlogic_cs";
 64                                                    66 
 65 #ifdef PCMCIA_DEBUG                                67 #ifdef PCMCIA_DEBUG
 66 static int pc_debug = PCMCIA_DEBUG;                68 static int pc_debug = PCMCIA_DEBUG;
 67 module_param(pc_debug, int, 0644);                 69 module_param(pc_debug, int, 0644);
 68 #define DEBUG(n, args...) if (pc_debug>(n)) pr     70 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 69 static char *version = "qlogic_cs.c 1.79-ac 20     71 static char *version = "qlogic_cs.c 1.79-ac 2002/10/26 (David Hinds)";
 70 #else                                              72 #else
 71 #define DEBUG(n, args...)                          73 #define DEBUG(n, args...)
 72 #endif                                             74 #endif
 73                                                    75 
 74 static struct scsi_host_template qlogicfas_dri !!  76 static Scsi_Host_Template qlogicfas_driver_template = {
 75         .module                 = THIS_MODULE,     77         .module                 = THIS_MODULE,
 76         .name                   = qlogic_name,     78         .name                   = qlogic_name,
 77         .proc_name              = qlogic_name,     79         .proc_name              = qlogic_name,
 78         .info                   = qlogicfas408     80         .info                   = qlogicfas408_info,
 79         .queuecommand           = qlogicfas408     81         .queuecommand           = qlogicfas408_queuecommand,
 80         .eh_abort_handler       = qlogicfas408     82         .eh_abort_handler       = qlogicfas408_abort,
 81         .eh_bus_reset_handler   = qlogicfas408     83         .eh_bus_reset_handler   = qlogicfas408_bus_reset,
                                                   >>  84         .eh_device_reset_handler= qlogicfas408_device_reset,
                                                   >>  85         .eh_host_reset_handler  = qlogicfas408_host_reset,
 82         .bios_param             = qlogicfas408     86         .bios_param             = qlogicfas408_biosparam,
 83         .can_queue              = 1,               87         .can_queue              = 1,
 84         .this_id                = -1,              88         .this_id                = -1,
 85         .sg_tablesize           = SG_ALL,          89         .sg_tablesize           = SG_ALL,
 86         .cmd_per_lun            = 1,               90         .cmd_per_lun            = 1,
 87         .use_clustering         = DISABLE_CLUS     91         .use_clustering         = DISABLE_CLUSTERING,
 88 };                                                 92 };
 89                                                    93 
 90 /*============================================     94 /*====================================================================*/
 91                                                    95 
 92 typedef struct scsi_info_t {                       96 typedef struct scsi_info_t {
 93         struct pcmcia_device    *p_dev;        !!  97         dev_link_t link;
 94         dev_node_t node;                           98         dev_node_t node;
 95         struct Scsi_Host *host;                    99         struct Scsi_Host *host;
 96         unsigned short manf_id;                   100         unsigned short manf_id;
 97 } scsi_info_t;                                    101 } scsi_info_t;
 98                                                   102 
 99 static void qlogic_release(struct pcmcia_devic !! 103 static void qlogic_release(dev_link_t *link);
100 static void qlogic_detach(struct pcmcia_device !! 104 static int qlogic_event(event_t event, int priority, event_callback_args_t * args);
101 static int qlogic_config(struct pcmcia_device  << 
102                                                   105 
103 static struct Scsi_Host *qlogic_detect(struct  !! 106 static dev_link_t *qlogic_attach(void);
104                                 struct pcmcia_ !! 107 static void qlogic_detach(dev_link_t *);
                                                   >> 108 
                                                   >> 109 
                                                   >> 110 static dev_link_t *dev_list = NULL;
                                                   >> 111 
                                                   >> 112 static dev_info_t dev_info = "qlogic_cs";
                                                   >> 113 
                                                   >> 114 static struct Scsi_Host *qlogic_detect(Scsi_Host_Template *host,
                                                   >> 115                                 dev_link_t *link, int qbase, int qlirq)
105 {                                                 116 {
106         int qltyp;              /* type of chi    117         int qltyp;              /* type of chip */
107         int qinitid;                              118         int qinitid;
108         struct Scsi_Host *shost;        /* reg    119         struct Scsi_Host *shost;        /* registered host structure */
109         struct qlogicfas408_priv *priv;           120         struct qlogicfas408_priv *priv;
110                                                   121 
111         qltyp = qlogicfas408_get_chip_type(qba    122         qltyp = qlogicfas408_get_chip_type(qbase, INT_TYPE);
112         qinitid = host->this_id;                  123         qinitid = host->this_id;
113         if (qinitid < 0)                          124         if (qinitid < 0)
114                 qinitid = 7;    /* if no ID, u    125                 qinitid = 7;    /* if no ID, use 7 */
115                                                   126 
116         qlogicfas408_setup(qbase, qinitid, INT    127         qlogicfas408_setup(qbase, qinitid, INT_TYPE);
117                                                   128 
118         host->name = qlogic_name;                 129         host->name = qlogic_name;
119         shost = scsi_host_alloc(host, sizeof(s    130         shost = scsi_host_alloc(host, sizeof(struct qlogicfas408_priv));
120         if (!shost)                               131         if (!shost)
121                 goto err;                         132                 goto err;
122         shost->io_port = qbase;                   133         shost->io_port = qbase;
123         shost->n_io_port = 16;                    134         shost->n_io_port = 16;
124         shost->dma_channel = -1;                  135         shost->dma_channel = -1;
125         if (qlirq != -1)                          136         if (qlirq != -1)
126                 shost->irq = qlirq;               137                 shost->irq = qlirq;
127                                                   138 
128         priv = get_priv_by_host(shost);           139         priv = get_priv_by_host(shost);
129         priv->qlirq = qlirq;                      140         priv->qlirq = qlirq;
130         priv->qbase = qbase;                      141         priv->qbase = qbase;
131         priv->qinitid = qinitid;                  142         priv->qinitid = qinitid;
132         priv->shost = shost;                      143         priv->shost = shost;
133         priv->int_type = INT_TYPE;                144         priv->int_type = INT_TYPE;                                      
134                                                   145 
135         if (request_irq(qlirq, qlogicfas408_ih    146         if (request_irq(qlirq, qlogicfas408_ihandl, 0, qlogic_name, shost))
136                 goto free_scsi_host;              147                 goto free_scsi_host;
137                                                   148 
138         sprintf(priv->qinfo,                      149         sprintf(priv->qinfo,
139                 "Qlogicfas Driver version 0.46    150                 "Qlogicfas Driver version 0.46, chip %02X at %03X, IRQ %d, TPdma:%d",
140                 qltyp, qbase, qlirq, QL_TURBO_    151                 qltyp, qbase, qlirq, QL_TURBO_PDMA);
141                                                   152 
142         if (scsi_add_host(shost, NULL))           153         if (scsi_add_host(shost, NULL))
143                 goto free_interrupt;              154                 goto free_interrupt;
144                                                   155 
145         scsi_scan_host(shost);                    156         scsi_scan_host(shost);
146                                                   157 
147         return shost;                             158         return shost;
148                                                   159 
149 free_interrupt:                                   160 free_interrupt:
150         free_irq(qlirq, shost);                   161         free_irq(qlirq, shost);
151                                                   162 
152 free_scsi_host:                                   163 free_scsi_host:
153         scsi_host_put(shost);                     164         scsi_host_put(shost);
154                                                   165         
155 err:                                              166 err:
156         return NULL;                              167         return NULL;
157 }                                                 168 }
158 static int qlogic_probe(struct pcmcia_device * !! 169 static dev_link_t *qlogic_attach(void)
159 {                                                 170 {
160         scsi_info_t *info;                        171         scsi_info_t *info;
                                                   >> 172         client_reg_t client_reg;
                                                   >> 173         dev_link_t *link;
                                                   >> 174         int ret;
161                                                   175 
162         DEBUG(0, "qlogic_attach()\n");            176         DEBUG(0, "qlogic_attach()\n");
163                                                   177 
164         /* Create new SCSI device */              178         /* Create new SCSI device */
165         info = kzalloc(sizeof(*info), GFP_KERN !! 179         info = kmalloc(sizeof(*info), GFP_KERNEL);
166         if (!info)                                180         if (!info)
167                 return -ENOMEM;                !! 181                 return NULL;
168         info->p_dev = link;                    !! 182         memset(info, 0, sizeof(*info));
                                                   >> 183         link = &info->link;
169         link->priv = info;                        184         link->priv = info;
170         link->io.NumPorts1 = 16;                  185         link->io.NumPorts1 = 16;
171         link->io.Attributes1 = IO_DATA_PATH_WI    186         link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
172         link->io.IOAddrLines = 10;                187         link->io.IOAddrLines = 10;
173         link->irq.Attributes = IRQ_TYPE_EXCLUS    188         link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
174         link->irq.IRQInfo1 = IRQ_LEVEL_ID;        189         link->irq.IRQInfo1 = IRQ_LEVEL_ID;
175         link->conf.Attributes = CONF_ENABLE_IR    190         link->conf.Attributes = CONF_ENABLE_IRQ;
                                                   >> 191         link->conf.Vcc = 50;
176         link->conf.IntType = INT_MEMORY_AND_IO    192         link->conf.IntType = INT_MEMORY_AND_IO;
177         link->conf.Present = PRESENT_OPTION;      193         link->conf.Present = PRESENT_OPTION;
178                                                   194 
179         return qlogic_config(link);            !! 195         /* Register with Card Services */
                                                   >> 196         link->next = dev_list;
                                                   >> 197         dev_list = link;
                                                   >> 198         client_reg.dev_info = &dev_info;
                                                   >> 199         client_reg.event_handler = &qlogic_event;
                                                   >> 200         client_reg.EventMask = CS_EVENT_RESET_REQUEST | CS_EVENT_CARD_RESET | CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
                                                   >> 201         client_reg.Version = 0x0210;
                                                   >> 202         client_reg.event_callback_args.client_data = link;
                                                   >> 203         ret = pcmcia_register_client(&link->handle, &client_reg);
                                                   >> 204         if (ret != 0) {
                                                   >> 205                 cs_error(link->handle, RegisterClient, ret);
                                                   >> 206                 qlogic_detach(link);
                                                   >> 207                 return NULL;
                                                   >> 208         }
                                                   >> 209 
                                                   >> 210         return link;
180 }                               /* qlogic_atta    211 }                               /* qlogic_attach */
181                                                   212 
182 /*============================================    213 /*====================================================================*/
183                                                   214 
184 static void qlogic_detach(struct pcmcia_device !! 215 static void qlogic_detach(dev_link_t * link)
185 {                                                 216 {
                                                   >> 217         dev_link_t **linkp;
                                                   >> 218 
186         DEBUG(0, "qlogic_detach(0x%p)\n", link    219         DEBUG(0, "qlogic_detach(0x%p)\n", link);
187                                                   220 
188         qlogic_release(link);                  !! 221         /* Locate device structure */
                                                   >> 222         for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
                                                   >> 223                 if (*linkp == link)
                                                   >> 224                         break;
                                                   >> 225         if (*linkp == NULL)
                                                   >> 226                 return;
                                                   >> 227 
                                                   >> 228         if (link->state & DEV_CONFIG)
                                                   >> 229                 qlogic_release(link);
                                                   >> 230 
                                                   >> 231         if (link->handle)
                                                   >> 232                 pcmcia_deregister_client(link->handle);
                                                   >> 233 
                                                   >> 234         /* Unlink device structure, free bits */
                                                   >> 235         *linkp = link->next;
189         kfree(link->priv);                        236         kfree(link->priv);
190                                                   237 
191 }                               /* qlogic_deta    238 }                               /* qlogic_detach */
192                                                   239 
193 /*============================================    240 /*====================================================================*/
194                                                   241 
195 #define CS_CHECK(fn, ret) \                       242 #define CS_CHECK(fn, ret) \
196 do { last_fn = (fn); if ((last_ret = (ret)) !=    243 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
197                                                   244 
198 static int qlogic_config(struct pcmcia_device  !! 245 static void qlogic_config(dev_link_t * link)
199 {                                                 246 {
                                                   >> 247         client_handle_t handle = link->handle;
200         scsi_info_t *info = link->priv;           248         scsi_info_t *info = link->priv;
201         tuple_t tuple;                            249         tuple_t tuple;
202         cisparse_t parse;                         250         cisparse_t parse;
203         int i, last_ret, last_fn;                 251         int i, last_ret, last_fn;
204         unsigned short tuple_data[32];            252         unsigned short tuple_data[32];
205         struct Scsi_Host *host;                   253         struct Scsi_Host *host;
206                                                   254 
207         DEBUG(0, "qlogic_config(0x%p)\n", link    255         DEBUG(0, "qlogic_config(0x%p)\n", link);
208                                                   256 
209         info->manf_id = link->manf_id;         << 
210                                                << 
211         tuple.TupleData = (cisdata_t *) tuple_    257         tuple.TupleData = (cisdata_t *) tuple_data;
212         tuple.TupleDataMax = 64;                  258         tuple.TupleDataMax = 64;
213         tuple.TupleOffset = 0;                    259         tuple.TupleOffset = 0;
                                                   >> 260         tuple.DesiredTuple = CISTPL_CONFIG;
                                                   >> 261         CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
                                                   >> 262         CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
                                                   >> 263         CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
                                                   >> 264         link->conf.ConfigBase = parse.config.base;
                                                   >> 265 
                                                   >> 266         tuple.DesiredTuple = CISTPL_MANFID;
                                                   >> 267         if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS))
                                                   >> 268                 info->manf_id = le16_to_cpu(tuple.TupleData[0]);
                                                   >> 269 
                                                   >> 270         /* Configure card */
                                                   >> 271         link->state |= DEV_CONFIG;
214                                                   272 
215         tuple.DesiredTuple = CISTPL_CFTABLE_EN    273         tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
216         CS_CHECK(GetFirstTuple, pcmcia_get_fir !! 274         CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
217         while (1) {                               275         while (1) {
218                 if (pcmcia_get_tuple_data(link !! 276                 if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
219                                 pcmcia_parse_t !! 277                                 pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
220                         goto next_entry;          278                         goto next_entry;
221                 link->conf.ConfigIndex = parse    279                 link->conf.ConfigIndex = parse.cftable_entry.index;
222                 link->io.BasePort1 = parse.cft    280                 link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
223                 link->io.NumPorts1 = parse.cft    281                 link->io.NumPorts1 = parse.cftable_entry.io.win[0].len;
224                 if (link->io.BasePort1 != 0) {    282                 if (link->io.BasePort1 != 0) {
225                         i = pcmcia_request_io( !! 283                         i = pcmcia_request_io(handle, &link->io);
226                         if (i == CS_SUCCESS)      284                         if (i == CS_SUCCESS)
227                                 break;            285                                 break;
228                 }                                 286                 }
229               next_entry:                         287               next_entry:
230                 CS_CHECK(GetNextTuple, pcmcia_ !! 288                 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
231         }                                         289         }
232                                                   290 
233         CS_CHECK(RequestIRQ, pcmcia_request_ir !! 291         CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
234         CS_CHECK(RequestConfiguration, pcmcia_ !! 292         CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
235                                                   293 
236         if ((info->manf_id == MANFID_MACNICA)     294         if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
237                 /* set ATAcmd */                  295                 /* set ATAcmd */
238                 outb(0xb4, link->io.BasePort1     296                 outb(0xb4, link->io.BasePort1 + 0xd);
239                 outb(0x24, link->io.BasePort1     297                 outb(0x24, link->io.BasePort1 + 0x9);
240                 outb(0x04, link->io.BasePort1     298                 outb(0x04, link->io.BasePort1 + 0xd);
241         }                                         299         }
242                                                   300 
243         /* The KXL-810AN has a bigger IO port     301         /* The KXL-810AN has a bigger IO port window */
244         if (link->io.NumPorts1 == 32)             302         if (link->io.NumPorts1 == 32)
245                 host = qlogic_detect(&qlogicfa    303                 host = qlogic_detect(&qlogicfas_driver_template, link,
246                         link->io.BasePort1 + 1    304                         link->io.BasePort1 + 16, link->irq.AssignedIRQ);
247         else                                      305         else
248                 host = qlogic_detect(&qlogicfa    306                 host = qlogic_detect(&qlogicfas_driver_template, link,
249                         link->io.BasePort1, li    307                         link->io.BasePort1, link->irq.AssignedIRQ);
250                                                   308         
251         if (!host) {                              309         if (!host) {
252                 printk(KERN_INFO "%s: no SCSI     310                 printk(KERN_INFO "%s: no SCSI devices found\n", qlogic_name);
253                 goto cs_failed;                !! 311                 goto out;
254         }                                         312         }
255                                                   313 
256         sprintf(info->node.dev_name, "scsi%d",    314         sprintf(info->node.dev_name, "scsi%d", host->host_no);
257         link->dev_node = &info->node;          !! 315         link->dev = &info->node;
258         info->host = host;                        316         info->host = host;
259                                                   317 
260         return 0;                              !! 318 out:
                                                   >> 319         link->state &= ~DEV_CONFIG_PENDING;
                                                   >> 320         return;
261                                                   321 
262 cs_failed:                                        322 cs_failed:
263         cs_error(link, last_fn, last_ret);     !! 323         cs_error(link->handle, last_fn, last_ret);
264         pcmcia_disable_device(link);           !! 324         link->dev = NULL;
265         return -ENODEV;                        !! 325         pcmcia_release_configuration(link->handle);
                                                   >> 326         pcmcia_release_io(link->handle, &link->io);
                                                   >> 327         pcmcia_release_irq(link->handle, &link->irq);
                                                   >> 328         link->state &= ~DEV_CONFIG;
                                                   >> 329         return;
266                                                   330 
267 }                               /* qlogic_conf    331 }                               /* qlogic_config */
268                                                   332 
269 /*============================================    333 /*====================================================================*/
270                                                   334 
271 static void qlogic_release(struct pcmcia_devic !! 335 static void qlogic_release(dev_link_t *link)
272 {                                                 336 {
273         scsi_info_t *info = link->priv;           337         scsi_info_t *info = link->priv;
274                                                   338 
275         DEBUG(0, "qlogic_release(0x%p)\n", lin    339         DEBUG(0, "qlogic_release(0x%p)\n", link);
276                                                   340 
277         scsi_remove_host(info->host);             341         scsi_remove_host(info->host);
                                                   >> 342         link->dev = NULL;
278                                                   343 
279         free_irq(link->irq.AssignedIRQ, info->    344         free_irq(link->irq.AssignedIRQ, info->host);
280         pcmcia_disable_device(link);           !! 345 
                                                   >> 346         pcmcia_release_configuration(link->handle);
                                                   >> 347         pcmcia_release_io(link->handle, &link->io);
                                                   >> 348         pcmcia_release_irq(link->handle, &link->irq);
281                                                   349 
282         scsi_host_put(info->host);                350         scsi_host_put(info->host);
                                                   >> 351 
                                                   >> 352         link->state &= ~DEV_CONFIG;
283 }                                                 353 }
284                                                   354 
285 /*============================================    355 /*====================================================================*/
286                                                   356 
287 static int qlogic_resume(struct pcmcia_device  !! 357 static int qlogic_event(event_t event, int priority, event_callback_args_t * args)
288 {                                                 358 {
289         scsi_info_t *info = link->priv;        !! 359         dev_link_t *link = args->client_data;
290                                                   360 
291         pcmcia_request_configuration(link, &li !! 361         DEBUG(1, "qlogic_event(0x%06x)\n", event);
292         if ((info->manf_id == MANFID_MACNICA)  << 
293             (info->manf_id == MANFID_PIONEER)  << 
294             (info->manf_id == 0x0098)) {       << 
295                 outb(0x80, link->io.BasePort1  << 
296                 outb(0x24, link->io.BasePort1  << 
297                 outb(0x04, link->io.BasePort1  << 
298         }                                      << 
299         /* Ugggglllyyyy!!! */                  << 
300         qlogicfas408_bus_reset(NULL);          << 
301                                                   362 
                                                   >> 363         switch (event) {
                                                   >> 364         case CS_EVENT_CARD_REMOVAL:
                                                   >> 365                 link->state &= ~DEV_PRESENT;
                                                   >> 366                 if (link->state & DEV_CONFIG)
                                                   >> 367                         qlogic_release(link);
                                                   >> 368                 break;
                                                   >> 369         case CS_EVENT_CARD_INSERTION:
                                                   >> 370                 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                                                   >> 371                 qlogic_config(link);
                                                   >> 372                 break;
                                                   >> 373         case CS_EVENT_PM_SUSPEND:
                                                   >> 374                 link->state |= DEV_SUSPEND;
                                                   >> 375                 /* Fall through... */
                                                   >> 376         case CS_EVENT_RESET_PHYSICAL:
                                                   >> 377                 if (link->state & DEV_CONFIG)
                                                   >> 378                         pcmcia_release_configuration(link->handle);
                                                   >> 379                 break;
                                                   >> 380         case CS_EVENT_PM_RESUME:
                                                   >> 381                 link->state &= ~DEV_SUSPEND;
                                                   >> 382                 /* Fall through... */
                                                   >> 383         case CS_EVENT_CARD_RESET:
                                                   >> 384                 if (link->state & DEV_CONFIG) {
                                                   >> 385                         scsi_info_t *info = link->priv;
                                                   >> 386                         pcmcia_request_configuration(link->handle, &link->conf);
                                                   >> 387                         if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
                                                   >> 388                                 outb(0x80, link->io.BasePort1 + 0xd);
                                                   >> 389                                 outb(0x24, link->io.BasePort1 + 0x9);
                                                   >> 390                                 outb(0x04, link->io.BasePort1 + 0xd);
                                                   >> 391                         }
                                                   >> 392                         /* Ugggglllyyyy!!! */
                                                   >> 393                         qlogicfas408_bus_reset(NULL);
                                                   >> 394                 }
                                                   >> 395                 break;
                                                   >> 396         }
302         return 0;                                 397         return 0;
303 }                                              !! 398 }                               /* qlogic_event */
304                                                   399 
305 static struct pcmcia_device_id qlogic_ids[] =  << 
306         PCMCIA_DEVICE_PROD_ID12("EIger Labs",  << 
307         PCMCIA_DEVICE_PROD_ID12("EPSON", "SCSI << 
308         PCMCIA_DEVICE_PROD_ID12("MACNICA", "MI << 
309         PCMCIA_DEVICE_PROD_ID12("MIDORI ELECTR << 
310         PCMCIA_DEVICE_PROD_ID12("NEC", "PC-980 << 
311         PCMCIA_DEVICE_PROD_ID12("KME ", "KXLC0 << 
312         PCMCIA_DEVICE_PROD_ID12("KME ", "KXLC0 << 
313         PCMCIA_DEVICE_PROD_ID12("KME", "KXLC10 << 
314         PCMCIA_DEVICE_PROD_ID12("QLOGIC CORPOR << 
315         PCMCIA_DEVICE_PROD_ID12("QLOGIC CORPOR << 
316         PCMCIA_DEVICE_PROD_ID123("KME", "KXLC0 << 
317         PCMCIA_DEVICE_PROD_ID12("RATOC System  << 
318         PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "SC << 
319         PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "SC << 
320         /* these conflict with other cards! */ << 
321         /* PCMCIA_DEVICE_PROD_ID123("MACNICA", << 
322         /* PCMCIA_DEVICE_PROD_ID123("MACNICA", << 
323         PCMCIA_DEVICE_NULL,                    << 
324 };                                             << 
325 MODULE_DEVICE_TABLE(pcmcia, qlogic_ids);       << 
326                                                   400 
327 static struct pcmcia_driver qlogic_cs_driver =    401 static struct pcmcia_driver qlogic_cs_driver = {
328         .owner          = THIS_MODULE,            402         .owner          = THIS_MODULE,
329         .drv            = {                       403         .drv            = {
330         .name           = "qlogic_cs",            404         .name           = "qlogic_cs",
331         },                                        405         },
332         .probe          = qlogic_probe,        !! 406         .attach         = qlogic_attach,
333         .remove         = qlogic_detach,       !! 407         .detach         = qlogic_detach,
334         .id_table       = qlogic_ids,          << 
335         .resume         = qlogic_resume,       << 
336 };                                                408 };
337                                                   409 
338 static int __init init_qlogic_cs(void)            410 static int __init init_qlogic_cs(void)
339 {                                                 411 {
340         return pcmcia_register_driver(&qlogic_    412         return pcmcia_register_driver(&qlogic_cs_driver);
341 }                                                 413 }
342                                                   414 
343 static void __exit exit_qlogic_cs(void)           415 static void __exit exit_qlogic_cs(void)
344 {                                                 416 {
345         pcmcia_unregister_driver(&qlogic_cs_dr    417         pcmcia_unregister_driver(&qlogic_cs_driver);
                                                   >> 418         BUG_ON(dev_list != NULL);
346 }                                                 419 }
347                                                   420 
348 MODULE_AUTHOR("Tom Zerucha, Michael Griffith")    421 MODULE_AUTHOR("Tom Zerucha, Michael Griffith");
349 MODULE_DESCRIPTION("Driver for the PCMCIA Qlog    422 MODULE_DESCRIPTION("Driver for the PCMCIA Qlogic FAS SCSI controllers");
350 MODULE_LICENSE("GPL");                            423 MODULE_LICENSE("GPL");
351 module_init(init_qlogic_cs);                      424 module_init(init_qlogic_cs);
352 module_exit(exit_qlogic_cs);                      425 module_exit(exit_qlogic_cs);
353                                                   426 
  This page was automatically generated by the LXR engine.