root/drivers/scsi/aacraid/commctrl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ioctl_send_fib
  2. open_getadapter_fib
  3. next_getadapter_fib
  4. aac_close_fib_context
  5. close_getadapter_fib
  6. check_revision
  7. aac_send_raw_srb
  8. aac_get_pci_info
  9. aac_get_hba_info
  10. aac_send_reset_adapter
  11. aac_do_ioctl

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

/* [<][>][^][v][top][bottom][index][help] */