cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

commctrl.c (29518B)


      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 */
     46static 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;
    147cleanup:
    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 */
    167static 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
    230struct 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 */
    244static 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	 */
    304return_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
    355int 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
    400static 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
    450static 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 */
    479static 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
    986cleanup:
    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
    998struct aac_pci_info {
    999	u32 bus;
   1000	u32 slot;
   1001};
   1002
   1003
   1004static 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
   1018static 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
   1041struct aac_reset_iop {
   1042	u8	reset_type;
   1043};
   1044
   1045static 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
   1062int 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
   1116cleanup:
   1117	mutex_unlock(&dev->ioctl_mutex);
   1118
   1119	return status;
   1120}
   1121