scsi: aacraid: Fix incorrect spelling of aac_send_raw_srb()
[linux-2.6-microblaze.git] / drivers / scsi / aacraid / commctrl.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *      Adaptec AAC series RAID controller driver
4  *      (c) Copyright 2001 Red Hat Inc.
5  *
6  * based on the old aacraid driver that is..
7  * Adaptec aacraid device driver for Linux.
8  *
9  * Copyright (c) 2000-2010 Adaptec, Inc.
10  *               2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
11  *               2016-2017 Microsemi Corp. (aacraid@microsemi.com)
12  *
13  * Module Name:
14  *  commctrl.c
15  *
16  * Abstract: Contains all routines for control of the AFA comm layer
17  */
18
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/types.h>
22 #include <linux/pci.h>
23 #include <linux/spinlock.h>
24 #include <linux/slab.h>
25 #include <linux/completion.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/blkdev.h>
28 #include <linux/compat.h>
29 #include <linux/delay.h> /* ssleep prototype */
30 #include <linux/kthread.h>
31 #include <linux/uaccess.h>
32 #include <scsi/scsi_host.h>
33
34 #include "aacraid.h"
35
36 # define AAC_DEBUG_PREAMBLE     KERN_INFO
37 # define AAC_DEBUG_POSTAMBLE
38 /**
39  *      ioctl_send_fib  -       send a FIB from userspace
40  *      @dev:   adapter is being processed
41  *      @arg:   arguments to the ioctl call
42  *
43  *      This routine sends a fib to the adapter on behalf of a user level
44  *      program.
45  */
46 static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
47 {
48         struct hw_fib * kfib;
49         struct fib *fibptr;
50         struct hw_fib * hw_fib = (struct hw_fib *)0;
51         dma_addr_t hw_fib_pa = (dma_addr_t)0LL;
52         unsigned int size, osize;
53         int retval;
54
55         if (dev->in_reset) {
56                 return -EBUSY;
57         }
58         fibptr = aac_fib_alloc(dev);
59         if(fibptr == NULL) {
60                 return -ENOMEM;
61         }
62
63         kfib = fibptr->hw_fib_va;
64         /*
65          *      First copy in the header so that we can check the size field.
66          */
67         if (copy_from_user((void *)kfib, arg, sizeof(struct aac_fibhdr))) {
68                 aac_fib_free(fibptr);
69                 return -EFAULT;
70         }
71         /*
72          *      Since we copy based on the fib header size, make sure that we
73          *      will not overrun the buffer when we copy the memory. Return
74          *      an error if we would.
75          */
76         osize = size = le16_to_cpu(kfib->header.Size) +
77                 sizeof(struct aac_fibhdr);
78         if (size < le16_to_cpu(kfib->header.SenderSize))
79                 size = le16_to_cpu(kfib->header.SenderSize);
80         if (size > dev->max_fib_size) {
81                 dma_addr_t daddr;
82
83                 if (size > 2048) {
84                         retval = -EINVAL;
85                         goto cleanup;
86                 }
87
88                 kfib = dma_alloc_coherent(&dev->pdev->dev, size, &daddr,
89                                           GFP_KERNEL);
90                 if (!kfib) {
91                         retval = -ENOMEM;
92                         goto cleanup;
93                 }
94
95                 /* Highjack the hw_fib */
96                 hw_fib = fibptr->hw_fib_va;
97                 hw_fib_pa = fibptr->hw_fib_pa;
98                 fibptr->hw_fib_va = kfib;
99                 fibptr->hw_fib_pa = daddr;
100                 memset(((char *)kfib) + dev->max_fib_size, 0, size - dev->max_fib_size);
101                 memcpy(kfib, hw_fib, dev->max_fib_size);
102         }
103
104         if (copy_from_user(kfib, arg, size)) {
105                 retval = -EFAULT;
106                 goto cleanup;
107         }
108
109         /* Sanity check the second copy */
110         if ((osize != le16_to_cpu(kfib->header.Size) +
111                 sizeof(struct aac_fibhdr))
112                 || (size < le16_to_cpu(kfib->header.SenderSize))) {
113                 retval = -EINVAL;
114                 goto cleanup;
115         }
116
117         if (kfib->header.Command == cpu_to_le16(TakeABreakPt)) {
118                 aac_adapter_interrupt(dev);
119                 /*
120                  * Since we didn't really send a fib, zero out the state to allow
121                  * cleanup code not to assert.
122                  */
123                 kfib->header.XferState = 0;
124         } else {
125                 retval = aac_fib_send(le16_to_cpu(kfib->header.Command), fibptr,
126                                 le16_to_cpu(kfib->header.Size) , FsaNormal,
127                                 1, 1, NULL, NULL);
128                 if (retval) {
129                         goto cleanup;
130                 }
131                 if (aac_fib_complete(fibptr) != 0) {
132                         retval = -EINVAL;
133                         goto cleanup;
134                 }
135         }
136         /*
137          *      Make sure that the size returned by the adapter (which includes
138          *      the header) is less than or equal to the size of a fib, so we
139          *      don't corrupt application data. Then copy that size to the user
140          *      buffer. (Don't try to add the header information again, since it
141          *      was already included by the adapter.)
142          */
143
144         retval = 0;
145         if (copy_to_user(arg, (void *)kfib, size))
146                 retval = -EFAULT;
147 cleanup:
148         if (hw_fib) {
149                 dma_free_coherent(&dev->pdev->dev, size, kfib,
150                                   fibptr->hw_fib_pa);
151                 fibptr->hw_fib_pa = hw_fib_pa;
152                 fibptr->hw_fib_va = hw_fib;
153         }
154         if (retval != -ERESTARTSYS)
155                 aac_fib_free(fibptr);
156         return retval;
157 }
158
159 /**
160  *      open_getadapter_fib     -       Get the next fib
161  *      @dev:   adapter is being processed
162  *      @arg:   arguments to the open call
163  *
164  *      This routine will get the next Fib, if available, from the AdapterFibContext
165  *      passed in from the user.
166  */
167 static int open_getadapter_fib(struct aac_dev * dev, void __user *arg)
168 {
169         struct aac_fib_context * fibctx;
170         int status;
171
172         fibctx = kmalloc(sizeof(struct aac_fib_context), GFP_KERNEL);
173         if (fibctx == NULL) {
174                 status = -ENOMEM;
175         } else {
176                 unsigned long flags;
177                 struct list_head * entry;
178                 struct aac_fib_context * context;
179
180                 fibctx->type = FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT;
181                 fibctx->size = sizeof(struct aac_fib_context);
182                 /*
183                  *      Yes yes, I know this could be an index, but we have a
184                  * better guarantee of uniqueness for the locked loop below.
185                  * Without the aid of a persistent history, this also helps
186                  * reduce the chance that the opaque context would be reused.
187                  */
188                 fibctx->unique = (u32)((ulong)fibctx & 0xFFFFFFFF);
189                 /*
190                  *      Initialize the mutex used to wait for the next AIF.
191                  */
192                 init_completion(&fibctx->completion);
193                 fibctx->wait = 0;
194                 /*
195                  *      Initialize the fibs and set the count of fibs on
196                  *      the list to 0.
197                  */
198                 fibctx->count = 0;
199                 INIT_LIST_HEAD(&fibctx->fib_list);
200                 fibctx->jiffies = jiffies/HZ;
201                 /*
202                  *      Now add this context onto the adapter's
203                  *      AdapterFibContext list.
204                  */
205                 spin_lock_irqsave(&dev->fib_lock, flags);
206                 /* Ensure that we have a unique identifier */
207                 entry = dev->fib_list.next;
208                 while (entry != &dev->fib_list) {
209                         context = list_entry(entry, struct aac_fib_context, next);
210                         if (context->unique == fibctx->unique) {
211                                 /* Not unique (32 bits) */
212                                 fibctx->unique++;
213                                 entry = dev->fib_list.next;
214                         } else {
215                                 entry = entry->next;
216                         }
217                 }
218                 list_add_tail(&fibctx->next, &dev->fib_list);
219                 spin_unlock_irqrestore(&dev->fib_lock, flags);
220                 if (copy_to_user(arg, &fibctx->unique,
221                                                 sizeof(fibctx->unique))) {
222                         status = -EFAULT;
223                 } else {
224                         status = 0;
225                 }
226         }
227         return status;
228 }
229
230 struct compat_fib_ioctl {
231         u32     fibctx;
232         s32     wait;
233         compat_uptr_t fib;
234 };
235
236 /**
237  *      next_getadapter_fib     -       get the next fib
238  *      @dev: adapter to use
239  *      @arg: ioctl argument
240  *
241  *      This routine will get the next Fib, if available, from the AdapterFibContext
242  *      passed in from the user.
243  */
244 static int next_getadapter_fib(struct aac_dev * dev, void __user *arg)
245 {
246         struct fib_ioctl f;
247         struct fib *fib;
248         struct aac_fib_context *fibctx;
249         int status;
250         struct list_head * entry;
251         unsigned long flags;
252
253         if (in_compat_syscall()) {
254                 struct compat_fib_ioctl cf;
255
256                 if (copy_from_user(&cf, arg, sizeof(struct compat_fib_ioctl)))
257                         return -EFAULT;
258
259                 f.fibctx = cf.fibctx;
260                 f.wait = cf.wait;
261                 f.fib = compat_ptr(cf.fib);
262         } else {
263                 if (copy_from_user(&f, arg, sizeof(struct fib_ioctl)))
264                         return -EFAULT;
265         }
266         /*
267          *      Verify that the HANDLE passed in was a valid AdapterFibContext
268          *
269          *      Search the list of AdapterFibContext addresses on the adapter
270          *      to be sure this is a valid address
271          */
272         spin_lock_irqsave(&dev->fib_lock, flags);
273         entry = dev->fib_list.next;
274         fibctx = NULL;
275
276         while (entry != &dev->fib_list) {
277                 fibctx = list_entry(entry, struct aac_fib_context, next);
278                 /*
279                  *      Extract the AdapterFibContext from the Input parameters.
280                  */
281                 if (fibctx->unique == f.fibctx) { /* We found a winner */
282                         break;
283                 }
284                 entry = entry->next;
285                 fibctx = NULL;
286         }
287         if (!fibctx) {
288                 spin_unlock_irqrestore(&dev->fib_lock, flags);
289                 dprintk ((KERN_INFO "Fib Context not found\n"));
290                 return -EINVAL;
291         }
292
293         if((fibctx->type != FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT) ||
294                  (fibctx->size != sizeof(struct aac_fib_context))) {
295                 spin_unlock_irqrestore(&dev->fib_lock, flags);
296                 dprintk ((KERN_INFO "Fib Context corrupt?\n"));
297                 return -EINVAL;
298         }
299         status = 0;
300         /*
301          *      If there are no fibs to send back, then either wait or return
302          *      -EAGAIN
303          */
304 return_fib:
305         if (!list_empty(&fibctx->fib_list)) {
306                 /*
307                  *      Pull the next fib from the fibs
308                  */
309                 entry = fibctx->fib_list.next;
310                 list_del(entry);
311
312                 fib = list_entry(entry, struct fib, fiblink);
313                 fibctx->count--;
314                 spin_unlock_irqrestore(&dev->fib_lock, flags);
315                 if (copy_to_user(f.fib, fib->hw_fib_va, sizeof(struct hw_fib))) {
316                         kfree(fib->hw_fib_va);
317                         kfree(fib);
318                         return -EFAULT;
319                 }
320                 /*
321                  *      Free the space occupied by this copy of the fib.
322                  */
323                 kfree(fib->hw_fib_va);
324                 kfree(fib);
325                 status = 0;
326         } else {
327                 spin_unlock_irqrestore(&dev->fib_lock, flags);
328                 /* If someone killed the AIF aacraid thread, restart it */
329                 status = !dev->aif_thread;
330                 if (status && !dev->in_reset && dev->queues && dev->fsa_dev) {
331                         /* Be paranoid, be very paranoid! */
332                         kthread_stop(dev->thread);
333                         ssleep(1);
334                         dev->aif_thread = 0;
335                         dev->thread = kthread_run(aac_command_thread, dev,
336                                                   "%s", dev->name);
337                         ssleep(1);
338                 }
339                 if (f.wait) {
340                         if (wait_for_completion_interruptible(&fibctx->completion) < 0) {
341                                 status = -ERESTARTSYS;
342                         } else {
343                                 /* Lock again and retry */
344                                 spin_lock_irqsave(&dev->fib_lock, flags);
345                                 goto return_fib;
346                         }
347                 } else {
348                         status = -EAGAIN;
349                 }
350         }
351         fibctx->jiffies = jiffies/HZ;
352         return status;
353 }
354
355 int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx)
356 {
357         struct fib *fib;
358
359         /*
360          *      First free any FIBs that have not been consumed.
361          */
362         while (!list_empty(&fibctx->fib_list)) {
363                 struct list_head * entry;
364                 /*
365                  *      Pull the next fib from the fibs
366                  */
367                 entry = fibctx->fib_list.next;
368                 list_del(entry);
369                 fib = list_entry(entry, struct fib, fiblink);
370                 fibctx->count--;
371                 /*
372                  *      Free the space occupied by this copy of the fib.
373                  */
374                 kfree(fib->hw_fib_va);
375                 kfree(fib);
376         }
377         /*
378          *      Remove the Context from the AdapterFibContext List
379          */
380         list_del(&fibctx->next);
381         /*
382          *      Invalidate context
383          */
384         fibctx->type = 0;
385         /*
386          *      Free the space occupied by the Context
387          */
388         kfree(fibctx);
389         return 0;
390 }
391
392 /**
393  *      close_getadapter_fib    -       close down user fib context
394  *      @dev: adapter
395  *      @arg: ioctl arguments
396  *
397  *      This routine will close down the fibctx passed in from the user.
398  */
399
400 static int close_getadapter_fib(struct aac_dev * dev, void __user *arg)
401 {
402         struct aac_fib_context *fibctx;
403         int status;
404         unsigned long flags;
405         struct list_head * entry;
406
407         /*
408          *      Verify that the HANDLE passed in was a valid AdapterFibContext
409          *
410          *      Search the list of AdapterFibContext addresses on the adapter
411          *      to be sure this is a valid address
412          */
413
414         entry = dev->fib_list.next;
415         fibctx = NULL;
416
417         while(entry != &dev->fib_list) {
418                 fibctx = list_entry(entry, struct aac_fib_context, next);
419                 /*
420                  *      Extract the fibctx from the input parameters
421                  */
422                 if (fibctx->unique == (u32)(uintptr_t)arg) /* We found a winner */
423                         break;
424                 entry = entry->next;
425                 fibctx = NULL;
426         }
427
428         if (!fibctx)
429                 return 0; /* Already gone */
430
431         if((fibctx->type != FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT) ||
432                  (fibctx->size != sizeof(struct aac_fib_context)))
433                 return -EINVAL;
434         spin_lock_irqsave(&dev->fib_lock, flags);
435         status = aac_close_fib_context(dev, fibctx);
436         spin_unlock_irqrestore(&dev->fib_lock, flags);
437         return status;
438 }
439
440 /**
441  *      check_revision  -       close down user fib context
442  *      @dev: adapter
443  *      @arg: ioctl arguments
444  *
445  *      This routine returns the driver version.
446  *      Under Linux, there have been no version incompatibilities, so this is
447  *      simple!
448  */
449
450 static int check_revision(struct aac_dev *dev, void __user *arg)
451 {
452         struct revision response;
453         char *driver_version = aac_driver_version;
454         u32 version;
455
456         response.compat = 1;
457         version = (simple_strtol(driver_version,
458                                 &driver_version, 10) << 24) | 0x00000400;
459         version += simple_strtol(driver_version + 1, &driver_version, 10) << 16;
460         version += simple_strtol(driver_version + 1, NULL, 10);
461         response.version = cpu_to_le32(version);
462 #       ifdef AAC_DRIVER_BUILD
463                 response.build = cpu_to_le32(AAC_DRIVER_BUILD);
464 #       else
465                 response.build = cpu_to_le32(9999);
466 #       endif
467
468         if (copy_to_user(arg, &response, sizeof(response)))
469                 return -EFAULT;
470         return 0;
471 }
472
473
474 /**
475  * aac_send_raw_srb()
476  *      @dev:   adapter is being processed
477  *      @arg:   arguments to the send call
478  */
479 static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
480 {
481         struct fib* srbfib;
482         int status;
483         struct aac_srb *srbcmd = NULL;
484         struct aac_hba_cmd_req *hbacmd = NULL;
485         struct user_aac_srb *user_srbcmd = NULL;
486         struct user_aac_srb __user *user_srb = arg;
487         struct aac_srb_reply __user *user_reply;
488         u32 chn;
489         u32 fibsize = 0;
490         u32 flags = 0;
491         s32 rcode = 0;
492         u32 data_dir;
493         void __user *sg_user[HBA_MAX_SG_EMBEDDED];
494         void *sg_list[HBA_MAX_SG_EMBEDDED];
495         u32 sg_count[HBA_MAX_SG_EMBEDDED];
496         u32 sg_indx = 0;
497         u32 byte_count = 0;
498         u32 actual_fibsize64, actual_fibsize = 0;
499         int i;
500         int is_native_device;
501         u64 address;
502
503
504         if (dev->in_reset) {
505                 dprintk((KERN_DEBUG"aacraid: send raw srb -EBUSY\n"));
506                 return -EBUSY;
507         }
508         if (!capable(CAP_SYS_ADMIN)){
509                 dprintk((KERN_DEBUG"aacraid: No permission to send raw srb\n"));
510                 return -EPERM;
511         }
512         /*
513          *      Allocate and initialize a Fib then setup a SRB command
514          */
515         if (!(srbfib = aac_fib_alloc(dev))) {
516                 return -ENOMEM;
517         }
518
519         memset(sg_list, 0, sizeof(sg_list)); /* cleanup may take issue */
520         if(copy_from_user(&fibsize, &user_srb->count,sizeof(u32))){
521                 dprintk((KERN_DEBUG"aacraid: Could not copy data size from user\n"));
522                 rcode = -EFAULT;
523                 goto cleanup;
524         }
525
526         if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) ||
527             (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) {
528                 rcode = -EINVAL;
529                 goto cleanup;
530         }
531
532         user_srbcmd = memdup_user(user_srb, fibsize);
533         if (IS_ERR(user_srbcmd)) {
534                 rcode = PTR_ERR(user_srbcmd);
535                 user_srbcmd = NULL;
536                 goto cleanup;
537         }
538
539         flags = user_srbcmd->flags; /* from user in cpu order */
540         switch (flags & (SRB_DataIn | SRB_DataOut)) {
541         case SRB_DataOut:
542                 data_dir = DMA_TO_DEVICE;
543                 break;
544         case (SRB_DataIn | SRB_DataOut):
545                 data_dir = DMA_BIDIRECTIONAL;
546                 break;
547         case SRB_DataIn:
548                 data_dir = DMA_FROM_DEVICE;
549                 break;
550         default:
551                 data_dir = DMA_NONE;
552         }
553         if (user_srbcmd->sg.count > ARRAY_SIZE(sg_list)) {
554                 dprintk((KERN_DEBUG"aacraid: too many sg entries %d\n",
555                         user_srbcmd->sg.count));
556                 rcode = -EINVAL;
557                 goto cleanup;
558         }
559         if ((data_dir == DMA_NONE) && user_srbcmd->sg.count) {
560                 dprintk((KERN_DEBUG"aacraid:SG with no direction specified\n"));
561                 rcode = -EINVAL;
562                 goto cleanup;
563         }
564         actual_fibsize = sizeof(struct aac_srb) - sizeof(struct sgentry) +
565                 ((user_srbcmd->sg.count & 0xff) * sizeof(struct sgentry));
566         actual_fibsize64 = actual_fibsize + (user_srbcmd->sg.count & 0xff) *
567           (sizeof(struct sgentry64) - sizeof(struct sgentry));
568         /* User made a mistake - should not continue */
569         if ((actual_fibsize != fibsize) && (actual_fibsize64 != fibsize)) {
570                 dprintk((KERN_DEBUG"aacraid: Bad Size specified in "
571                   "Raw SRB command calculated fibsize=%lu;%lu "
572                   "user_srbcmd->sg.count=%d aac_srb=%lu sgentry=%lu;%lu "
573                   "issued fibsize=%d\n",
574                   actual_fibsize, actual_fibsize64, user_srbcmd->sg.count,
575                   sizeof(struct aac_srb), sizeof(struct sgentry),
576                   sizeof(struct sgentry64), fibsize));
577                 rcode = -EINVAL;
578                 goto cleanup;
579         }
580
581         chn = user_srbcmd->channel;
582         if (chn < AAC_MAX_BUSES && user_srbcmd->id < AAC_MAX_TARGETS &&
583                 dev->hba_map[chn][user_srbcmd->id].devtype ==
584                 AAC_DEVTYPE_NATIVE_RAW) {
585                 is_native_device = 1;
586                 hbacmd = (struct aac_hba_cmd_req *)srbfib->hw_fib_va;
587                 memset(hbacmd, 0, 96);  /* sizeof(*hbacmd) is not necessary */
588
589                 /* iu_type is a parameter of aac_hba_send */
590                 switch (data_dir) {
591                 case DMA_TO_DEVICE:
592                         hbacmd->byte1 = 2;
593                         break;
594                 case DMA_FROM_DEVICE:
595                 case DMA_BIDIRECTIONAL:
596                         hbacmd->byte1 = 1;
597                         break;
598                 case DMA_NONE:
599                 default:
600                         break;
601                 }
602                 hbacmd->lun[1] = cpu_to_le32(user_srbcmd->lun);
603                 hbacmd->it_nexus = dev->hba_map[chn][user_srbcmd->id].rmw_nexus;
604
605                 /*
606                  * we fill in reply_qid later in aac_src_deliver_message
607                  * we fill in iu_type, request_id later in aac_hba_send
608                  * we fill in emb_data_desc_count, data_length later
609                  * in sg list build
610                  */
611
612                 memcpy(hbacmd->cdb, user_srbcmd->cdb, sizeof(hbacmd->cdb));
613
614                 address = (u64)srbfib->hw_error_pa;
615                 hbacmd->error_ptr_hi = cpu_to_le32((u32)(address >> 32));
616                 hbacmd->error_ptr_lo = cpu_to_le32((u32)(address & 0xffffffff));
617                 hbacmd->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE);
618                 hbacmd->emb_data_desc_count =
619                                         cpu_to_le32(user_srbcmd->sg.count);
620                 srbfib->hbacmd_size = 64 +
621                         user_srbcmd->sg.count * sizeof(struct aac_hba_sgl);
622
623         } else {
624                 is_native_device = 0;
625                 aac_fib_init(srbfib);
626
627                 /* raw_srb FIB is not FastResponseCapable */
628                 srbfib->hw_fib_va->header.XferState &=
629                         ~cpu_to_le32(FastResponseCapable);
630
631                 srbcmd = (struct aac_srb *) fib_data(srbfib);
632
633                 // Fix up srb for endian and force some values
634
635                 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this
636                 srbcmd->channel  = cpu_to_le32(user_srbcmd->channel);
637                 srbcmd->id       = cpu_to_le32(user_srbcmd->id);
638                 srbcmd->lun      = cpu_to_le32(user_srbcmd->lun);
639                 srbcmd->timeout  = cpu_to_le32(user_srbcmd->timeout);
640                 srbcmd->flags    = cpu_to_le32(flags);
641                 srbcmd->retry_limit = 0; // Obsolete parameter
642                 srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size);
643                 memcpy(srbcmd->cdb, user_srbcmd->cdb, sizeof(srbcmd->cdb));
644         }
645
646         byte_count = 0;
647         if (is_native_device) {
648                 struct user_sgmap *usg32 = &user_srbcmd->sg;
649                 struct user_sgmap64 *usg64 =
650                         (struct user_sgmap64 *)&user_srbcmd->sg;
651
652                 for (i = 0; i < usg32->count; i++) {
653                         void *p;
654                         u64 addr;
655
656                         sg_count[i] = (actual_fibsize64 == fibsize) ?
657                                 usg64->sg[i].count : usg32->sg[i].count;
658                         if (sg_count[i] >
659                                 (dev->scsi_host_ptr->max_sectors << 9)) {
660                                 pr_err("aacraid: upsg->sg[%d].count=%u>%u\n",
661                                         i, sg_count[i],
662                                         dev->scsi_host_ptr->max_sectors << 9);
663                                 rcode = -EINVAL;
664                                 goto cleanup;
665                         }
666
667                         p = kmalloc(sg_count[i], GFP_KERNEL);
668                         if (!p) {
669                                 rcode = -ENOMEM;
670                                 goto cleanup;
671                         }
672
673                         if (actual_fibsize64 == fibsize) {
674                                 addr = (u64)usg64->sg[i].addr[0];
675                                 addr += ((u64)usg64->sg[i].addr[1]) << 32;
676                         } else {
677                                 addr = (u64)usg32->sg[i].addr;
678                         }
679
680                         sg_user[i] = (void __user *)(uintptr_t)addr;
681                         sg_list[i] = p; // save so we can clean up later
682                         sg_indx = i;
683
684                         if (flags & SRB_DataOut) {
685                                 if (copy_from_user(p, sg_user[i],
686                                         sg_count[i])) {
687                                         rcode = -EFAULT;
688                                         goto cleanup;
689                                 }
690                         }
691                         addr = dma_map_single(&dev->pdev->dev, p, sg_count[i],
692                                               data_dir);
693                         hbacmd->sge[i].addr_hi = cpu_to_le32((u32)(addr>>32));
694                         hbacmd->sge[i].addr_lo = cpu_to_le32(
695                                                 (u32)(addr & 0xffffffff));
696                         hbacmd->sge[i].len = cpu_to_le32(sg_count[i]);
697                         hbacmd->sge[i].flags = 0;
698                         byte_count += sg_count[i];
699                 }
700
701                 if (usg32->count > 0)   /* embedded sglist */
702                         hbacmd->sge[usg32->count-1].flags =
703                                 cpu_to_le32(0x40000000);
704                 hbacmd->data_length = cpu_to_le32(byte_count);
705
706                 status = aac_hba_send(HBA_IU_TYPE_SCSI_CMD_REQ, srbfib,
707                                         NULL, NULL);
708
709         } else if (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64) {
710                 struct user_sgmap64* upsg = (struct user_sgmap64*)&user_srbcmd->sg;
711                 struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg;
712
713                 /*
714                  * This should also catch if user used the 32 bit sgmap
715                  */
716                 if (actual_fibsize64 == fibsize) {
717                         actual_fibsize = actual_fibsize64;
718                         for (i = 0; i < upsg->count; i++) {
719                                 u64 addr;
720                                 void* p;
721
722                                 sg_count[i] = upsg->sg[i].count;
723                                 if (sg_count[i] >
724                                     ((dev->adapter_info.options &
725                                      AAC_OPT_NEW_COMM) ?
726                                       (dev->scsi_host_ptr->max_sectors << 9) :
727                                       65536)) {
728                                         rcode = -EINVAL;
729                                         goto cleanup;
730                                 }
731
732                                 p = kmalloc(sg_count[i], GFP_KERNEL);
733                                 if(!p) {
734                                         dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
735                                           sg_count[i], i, upsg->count));
736                                         rcode = -ENOMEM;
737                                         goto cleanup;
738                                 }
739                                 addr = (u64)upsg->sg[i].addr[0];
740                                 addr += ((u64)upsg->sg[i].addr[1]) << 32;
741                                 sg_user[i] = (void __user *)(uintptr_t)addr;
742                                 sg_list[i] = p; // save so we can clean up later
743                                 sg_indx = i;
744
745                                 if (flags & SRB_DataOut) {
746                                         if (copy_from_user(p, sg_user[i],
747                                                 sg_count[i])){
748                                                 dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
749                                                 rcode = -EFAULT;
750                                                 goto cleanup;
751                                         }
752                                 }
753                                 addr = dma_map_single(&dev->pdev->dev, p,
754                                                       sg_count[i], data_dir);
755
756                                 psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
757                                 psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
758                                 byte_count += sg_count[i];
759                                 psg->sg[i].count = cpu_to_le32(sg_count[i]);
760                         }
761                 } else {
762                         struct user_sgmap* usg;
763                         usg = kmemdup(upsg,
764                                       actual_fibsize - sizeof(struct aac_srb)
765                                       + sizeof(struct sgmap), GFP_KERNEL);
766                         if (!usg) {
767                                 dprintk((KERN_DEBUG"aacraid: Allocation error in Raw SRB command\n"));
768                                 rcode = -ENOMEM;
769                                 goto cleanup;
770                         }
771                         actual_fibsize = actual_fibsize64;
772
773                         for (i = 0; i < usg->count; i++) {
774                                 u64 addr;
775                                 void* p;
776
777                                 sg_count[i] = usg->sg[i].count;
778                                 if (sg_count[i] >
779                                     ((dev->adapter_info.options &
780                                      AAC_OPT_NEW_COMM) ?
781                                       (dev->scsi_host_ptr->max_sectors << 9) :
782                                       65536)) {
783                                         kfree(usg);
784                                         rcode = -EINVAL;
785                                         goto cleanup;
786                                 }
787
788                                 p = kmalloc(sg_count[i], GFP_KERNEL);
789                                 if(!p) {
790                                         dprintk((KERN_DEBUG "aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
791                                                 sg_count[i], i, usg->count));
792                                         kfree(usg);
793                                         rcode = -ENOMEM;
794                                         goto cleanup;
795                                 }
796                                 sg_user[i] = (void __user *)(uintptr_t)usg->sg[i].addr;
797                                 sg_list[i] = p; // save so we can clean up later
798                                 sg_indx = i;
799
800                                 if (flags & SRB_DataOut) {
801                                         if (copy_from_user(p, sg_user[i],
802                                                 sg_count[i])) {
803                                                 kfree (usg);
804                                                 dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
805                                                 rcode = -EFAULT;
806                                                 goto cleanup;
807                                         }
808                                 }
809                                 addr = dma_map_single(&dev->pdev->dev, p,
810                                                       sg_count[i], data_dir);
811
812                                 psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
813                                 psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
814                                 byte_count += sg_count[i];
815                                 psg->sg[i].count = cpu_to_le32(sg_count[i]);
816                         }
817                         kfree (usg);
818                 }
819                 srbcmd->count = cpu_to_le32(byte_count);
820                 if (user_srbcmd->sg.count)
821                         psg->count = cpu_to_le32(sg_indx+1);
822                 else
823                         psg->count = 0;
824                 status = aac_fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL);
825         } else {
826                 struct user_sgmap* upsg = &user_srbcmd->sg;
827                 struct sgmap* psg = &srbcmd->sg;
828
829                 if (actual_fibsize64 == fibsize) {
830                         struct user_sgmap64* usg = (struct user_sgmap64 *)upsg;
831                         for (i = 0; i < upsg->count; i++) {
832                                 uintptr_t addr;
833                                 void* p;
834
835                                 sg_count[i] = usg->sg[i].count;
836                                 if (sg_count[i] >
837                                     ((dev->adapter_info.options &
838                                      AAC_OPT_NEW_COMM) ?
839                                       (dev->scsi_host_ptr->max_sectors << 9) :
840                                       65536)) {
841                                         rcode = -EINVAL;
842                                         goto cleanup;
843                                 }
844                                 p = kmalloc(sg_count[i], GFP_KERNEL);
845                                 if (!p) {
846                                         dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
847                                                 sg_count[i], i, usg->count));
848                                         rcode = -ENOMEM;
849                                         goto cleanup;
850                                 }
851                                 addr = (u64)usg->sg[i].addr[0];
852                                 addr += ((u64)usg->sg[i].addr[1]) << 32;
853                                 sg_user[i] = (void __user *)addr;
854                                 sg_list[i] = p; // save so we can clean up later
855                                 sg_indx = i;
856
857                                 if (flags & SRB_DataOut) {
858                                         if (copy_from_user(p, sg_user[i],
859                                                 sg_count[i])){
860                                                 dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
861                                                 rcode = -EFAULT;
862                                                 goto cleanup;
863                                         }
864                                 }
865                                 addr = dma_map_single(&dev->pdev->dev, p,
866                                                       usg->sg[i].count,
867                                                       data_dir);
868
869                                 psg->sg[i].addr = cpu_to_le32(addr & 0xffffffff);
870                                 byte_count += usg->sg[i].count;
871                                 psg->sg[i].count = cpu_to_le32(sg_count[i]);
872                         }
873                 } else {
874                         for (i = 0; i < upsg->count; i++) {
875                                 dma_addr_t addr;
876                                 void* p;
877
878                                 sg_count[i] = upsg->sg[i].count;
879                                 if (sg_count[i] >
880                                     ((dev->adapter_info.options &
881                                      AAC_OPT_NEW_COMM) ?
882                                       (dev->scsi_host_ptr->max_sectors << 9) :
883                                       65536)) {
884                                         rcode = -EINVAL;
885                                         goto cleanup;
886                                 }
887                                 p = kmalloc(sg_count[i], GFP_KERNEL);
888                                 if (!p) {
889                                         dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
890                                           sg_count[i], i, upsg->count));
891                                         rcode = -ENOMEM;
892                                         goto cleanup;
893                                 }
894                                 sg_user[i] = (void __user *)(uintptr_t)upsg->sg[i].addr;
895                                 sg_list[i] = p; // save so we can clean up later
896                                 sg_indx = i;
897
898                                 if (flags & SRB_DataOut) {
899                                         if (copy_from_user(p, sg_user[i],
900                                                 sg_count[i])) {
901                                                 dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
902                                                 rcode = -EFAULT;
903                                                 goto cleanup;
904                                         }
905                                 }
906                                 addr = dma_map_single(&dev->pdev->dev, p,
907                                                       sg_count[i], data_dir);
908
909                                 psg->sg[i].addr = cpu_to_le32(addr);
910                                 byte_count += sg_count[i];
911                                 psg->sg[i].count = cpu_to_le32(sg_count[i]);
912                         }
913                 }
914                 srbcmd->count = cpu_to_le32(byte_count);
915                 if (user_srbcmd->sg.count)
916                         psg->count = cpu_to_le32(sg_indx+1);
917                 else
918                         psg->count = 0;
919                 status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL);
920         }
921
922         if (status == -ERESTARTSYS) {
923                 rcode = -ERESTARTSYS;
924                 goto cleanup;
925         }
926
927         if (status != 0) {
928                 dprintk((KERN_DEBUG"aacraid: Could not send raw srb fib to hba\n"));
929                 rcode = -ENXIO;
930                 goto cleanup;
931         }
932
933         if (flags & SRB_DataIn) {
934                 for(i = 0 ; i <= sg_indx; i++){
935                         if (copy_to_user(sg_user[i], sg_list[i], sg_count[i])) {
936                                 dprintk((KERN_DEBUG"aacraid: Could not copy sg data to user\n"));
937                                 rcode = -EFAULT;
938                                 goto cleanup;
939
940                         }
941                 }
942         }
943
944         user_reply = arg + fibsize;
945         if (is_native_device) {
946                 struct aac_hba_resp *err =
947                         &((struct aac_native_hba *)srbfib->hw_fib_va)->resp.err;
948                 struct aac_srb_reply reply;
949
950                 memset(&reply, 0, sizeof(reply));
951                 reply.status = ST_OK;
952                 if (srbfib->flags & FIB_CONTEXT_FLAG_FASTRESP) {
953                         /* fast response */
954                         reply.srb_status = SRB_STATUS_SUCCESS;
955                         reply.scsi_status = 0;
956                         reply.data_xfer_length = byte_count;
957                         reply.sense_data_size = 0;
958                         memset(reply.sense_data, 0, AAC_SENSE_BUFFERSIZE);
959                 } else {
960                         reply.srb_status = err->service_response;
961                         reply.scsi_status = err->status;
962                         reply.data_xfer_length = byte_count -
963                                 le32_to_cpu(err->residual_count);
964                         reply.sense_data_size = err->sense_response_data_len;
965                         memcpy(reply.sense_data, err->sense_response_buf,
966                                 AAC_SENSE_BUFFERSIZE);
967                 }
968                 if (copy_to_user(user_reply, &reply,
969                         sizeof(struct aac_srb_reply))) {
970                         dprintk((KERN_DEBUG"aacraid: Copy to user failed\n"));
971                         rcode = -EFAULT;
972                         goto cleanup;
973                 }
974         } else {
975                 struct aac_srb_reply *reply;
976
977                 reply = (struct aac_srb_reply *) fib_data(srbfib);
978                 if (copy_to_user(user_reply, reply,
979                         sizeof(struct aac_srb_reply))) {
980                         dprintk((KERN_DEBUG"aacraid: Copy to user failed\n"));
981                         rcode = -EFAULT;
982                         goto cleanup;
983                 }
984         }
985
986 cleanup:
987         kfree(user_srbcmd);
988         if (rcode != -ERESTARTSYS) {
989                 for (i = 0; i <= sg_indx; i++)
990                         kfree(sg_list[i]);
991                 aac_fib_complete(srbfib);
992                 aac_fib_free(srbfib);
993         }
994
995         return rcode;
996 }
997
998 struct aac_pci_info {
999         u32 bus;
1000         u32 slot;
1001 };
1002
1003
1004 static int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
1005 {
1006         struct aac_pci_info pci_info;
1007
1008         pci_info.bus = dev->pdev->bus->number;
1009         pci_info.slot = PCI_SLOT(dev->pdev->devfn);
1010
1011         if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) {
1012                 dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n"));
1013                 return -EFAULT;
1014         }
1015         return 0;
1016 }
1017
1018 static int aac_get_hba_info(struct aac_dev *dev, void __user *arg)
1019 {
1020         struct aac_hba_info hbainfo;
1021
1022         memset(&hbainfo, 0, sizeof(hbainfo));
1023         hbainfo.adapter_number          = (u8) dev->id;
1024         hbainfo.system_io_bus_number    = dev->pdev->bus->number;
1025         hbainfo.device_number           = (dev->pdev->devfn >> 3);
1026         hbainfo.function_number         = (dev->pdev->devfn & 0x0007);
1027
1028         hbainfo.vendor_id               = dev->pdev->vendor;
1029         hbainfo.device_id               = dev->pdev->device;
1030         hbainfo.sub_vendor_id           = dev->pdev->subsystem_vendor;
1031         hbainfo.sub_system_id           = dev->pdev->subsystem_device;
1032
1033         if (copy_to_user(arg, &hbainfo, sizeof(struct aac_hba_info))) {
1034                 dprintk((KERN_DEBUG "aacraid: Could not copy hba info\n"));
1035                 return -EFAULT;
1036         }
1037
1038         return 0;
1039 }
1040
1041 struct aac_reset_iop {
1042         u8      reset_type;
1043 };
1044
1045 static int aac_send_reset_adapter(struct aac_dev *dev, void __user *arg)
1046 {
1047         struct aac_reset_iop reset;
1048         int retval;
1049
1050         if (copy_from_user((void *)&reset, arg, sizeof(struct aac_reset_iop)))
1051                 return -EFAULT;
1052
1053         dev->adapter_shutdown = 1;
1054
1055         mutex_unlock(&dev->ioctl_mutex);
1056         retval = aac_reset_adapter(dev, 0, reset.reset_type);
1057         mutex_lock(&dev->ioctl_mutex);
1058
1059         return retval;
1060 }
1061
1062 int aac_do_ioctl(struct aac_dev *dev, unsigned int cmd, void __user *arg)
1063 {
1064         int status;
1065
1066         mutex_lock(&dev->ioctl_mutex);
1067
1068         if (dev->adapter_shutdown) {
1069                 status = -EACCES;
1070                 goto cleanup;
1071         }
1072
1073         /*
1074          *      HBA gets first crack
1075          */
1076
1077         status = aac_dev_ioctl(dev, cmd, arg);
1078         if (status != -ENOTTY)
1079                 goto cleanup;
1080
1081         switch (cmd) {
1082         case FSACTL_MINIPORT_REV_CHECK:
1083                 status = check_revision(dev, arg);
1084                 break;
1085         case FSACTL_SEND_LARGE_FIB:
1086         case FSACTL_SENDFIB:
1087                 status = ioctl_send_fib(dev, arg);
1088                 break;
1089         case FSACTL_OPEN_GET_ADAPTER_FIB:
1090                 status = open_getadapter_fib(dev, arg);
1091                 break;
1092         case FSACTL_GET_NEXT_ADAPTER_FIB:
1093                 status = next_getadapter_fib(dev, arg);
1094                 break;
1095         case FSACTL_CLOSE_GET_ADAPTER_FIB:
1096                 status = close_getadapter_fib(dev, arg);
1097                 break;
1098         case FSACTL_SEND_RAW_SRB:
1099                 status = aac_send_raw_srb(dev,arg);
1100                 break;
1101         case FSACTL_GET_PCI_INFO:
1102                 status = aac_get_pci_info(dev,arg);
1103                 break;
1104         case FSACTL_GET_HBA_INFO:
1105                 status = aac_get_hba_info(dev, arg);
1106                 break;
1107         case FSACTL_RESET_IOP:
1108                 status = aac_send_reset_adapter(dev, arg);
1109                 break;
1110
1111         default:
1112                 status = -ENOTTY;
1113                 break;
1114         }
1115
1116 cleanup:
1117         mutex_unlock(&dev->ioctl_mutex);
1118
1119         return status;
1120 }
1121