Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mpt2sas_ctl.c
Go to the documentation of this file.
1 /*
2  * Management Module Support for MPT (Message Passing Technology) based
3  * controllers
4  *
5  * This code is based on drivers/scsi/mpt2sas/mpt2_ctl.c
6  * Copyright (C) 2007-2012 LSI Corporation
7  * (mailto:[email protected])
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * NO WARRANTY
20  * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
21  * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
22  * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
23  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
24  * solely responsible for determining the appropriateness of using and
25  * distributing the Program and assumes all risks associated with its
26  * exercise of rights under this Agreement, including but not limited to
27  * the risks and costs of program errors, damage to or loss of data,
28  * programs or equipment, and unavailability or interruption of operations.
29 
30  * DISCLAIMER OF LIABILITY
31  * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
32  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33  * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
34  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
35  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
36  * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
37  * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
38 
39  * You should have received a copy of the GNU General Public License
40  * along with this program; if not, write to the Free Software
41  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
42  * USA.
43  */
44 
45 #include <linux/kernel.h>
46 #include <linux/module.h>
47 #include <linux/errno.h>
48 #include <linux/init.h>
49 #include <linux/slab.h>
50 #include <linux/types.h>
51 #include <linux/pci.h>
52 #include <linux/delay.h>
53 #include <linux/mutex.h>
54 #include <linux/compat.h>
55 #include <linux/poll.h>
56 
57 #include <linux/io.h>
58 #include <linux/uaccess.h>
59 
60 #include "mpt2sas_base.h"
61 #include "mpt2sas_ctl.h"
62 
63 static DEFINE_MUTEX(_ctl_mutex);
64 static struct fasync_struct *async_queue;
65 static DECLARE_WAIT_QUEUE_HEAD(ctl_poll_wait);
66 
67 static int _ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type,
68  u8 *issue_reset);
69 
81 };
82 
83 #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
84 
93 static struct _sas_device *
94 _ctl_sas_device_find_by_handle(struct MPT2SAS_ADAPTER *ioc, u16 handle)
95 {
96  struct _sas_device *sas_device, *r;
97 
98  r = NULL;
99  list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
100  if (sas_device->handle != handle)
101  continue;
102  r = sas_device;
103  goto out;
104  }
105 
106  out:
107  return r;
108 }
109 
121 static void
122 _ctl_display_some_debug(struct MPT2SAS_ADAPTER *ioc, u16 smid,
123  char *calling_function_name, MPI2DefaultReply_t *mpi_reply)
124 {
125  Mpi2ConfigRequest_t *mpi_request;
126  char *desc = NULL;
127 
128  if (!(ioc->logging_level & MPT_DEBUG_IOCTL))
129  return;
130 
131  mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
132  switch (mpi_request->Function) {
134  {
135  Mpi2SCSIIORequest_t *scsi_request =
136  (Mpi2SCSIIORequest_t *)mpi_request;
137 
139  "scsi_io, cmd(0x%02x), cdb_len(%d)",
140  scsi_request->CDB.CDB32[0],
141  le16_to_cpu(scsi_request->IoFlags) & 0xF);
142  desc = ioc->tmp_string;
143  break;
144  }
146  desc = "task_mgmt";
147  break;
149  desc = "ioc_init";
150  break;
152  desc = "ioc_facts";
153  break;
155  {
157  (Mpi2ConfigRequest_t *)mpi_request;
158 
160  "config, type(0x%02x), ext_type(0x%02x), number(%d)",
161  (config_request->Header.PageType &
162  MPI2_CONFIG_PAGETYPE_MASK), config_request->ExtPageType,
163  config_request->Header.PageNumber);
164  desc = ioc->tmp_string;
165  break;
166  }
168  desc = "port_facts";
169  break;
171  desc = "port_enable";
172  break;
174  desc = "event_notification";
175  break;
177  desc = "fw_download";
178  break;
180  desc = "fw_upload";
181  break;
183  desc = "raid_action";
184  break;
186  {
187  Mpi2SCSIIORequest_t *scsi_request =
188  (Mpi2SCSIIORequest_t *)mpi_request;
189 
191  "raid_pass, cmd(0x%02x), cdb_len(%d)",
192  scsi_request->CDB.CDB32[0],
193  le16_to_cpu(scsi_request->IoFlags) & 0xF);
194  desc = ioc->tmp_string;
195  break;
196  }
198  desc = "sas_iounit_cntl";
199  break;
201  desc = "sata_pass";
202  break;
204  desc = "diag_buffer_post";
205  break;
207  desc = "diag_release";
208  break;
210  desc = "smp_passthrough";
211  break;
212  }
213 
214  if (!desc)
215  return;
216 
217  printk(MPT2SAS_INFO_FMT "%s: %s, smid(%d)\n",
218  ioc->name, calling_function_name, desc, smid);
219 
220  if (!mpi_reply)
221  return;
222 
223  if (mpi_reply->IOCStatus || mpi_reply->IOCLogInfo)
225  "\tiocstatus(0x%04x), loginfo(0x%08x)\n",
226  ioc->name, le16_to_cpu(mpi_reply->IOCStatus),
227  le32_to_cpu(mpi_reply->IOCLogInfo));
228 
229  if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST ||
230  mpi_request->Function ==
232  Mpi2SCSIIOReply_t *scsi_reply =
233  (Mpi2SCSIIOReply_t *)mpi_reply;
234  struct _sas_device *sas_device = NULL;
235  unsigned long flags;
236 
237  spin_lock_irqsave(&ioc->sas_device_lock, flags);
238  sas_device = _ctl_sas_device_find_by_handle(ioc,
239  le16_to_cpu(scsi_reply->DevHandle));
240  if (sas_device) {
241  printk(MPT2SAS_WARN_FMT "\tsas_address(0x%016llx), "
242  "phy(%d)\n", ioc->name, (unsigned long long)
243  sas_device->sas_address, sas_device->phy);
245  "\tenclosure_logical_id(0x%016llx), slot(%d)\n",
246  ioc->name, sas_device->enclosure_logical_id,
247  sas_device->slot);
248  }
249  spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
250  if (scsi_reply->SCSIState || scsi_reply->SCSIStatus)
252  "\tscsi_state(0x%02x), scsi_status"
253  "(0x%02x)\n", ioc->name,
254  scsi_reply->SCSIState,
255  scsi_reply->SCSIStatus);
256  }
257 }
258 #endif
259 
273 u8
274 mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
275  u32 reply)
276 {
277  MPI2DefaultReply_t *mpi_reply;
278  Mpi2SCSIIOReply_t *scsiio_reply;
279  const void *sense_data;
280  u32 sz;
281 
282  if (ioc->ctl_cmds.status == MPT2_CMD_NOT_USED)
283  return 1;
284  if (ioc->ctl_cmds.smid != smid)
285  return 1;
286  ioc->ctl_cmds.status |= MPT2_CMD_COMPLETE;
287  mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
288  if (mpi_reply) {
289  memcpy(ioc->ctl_cmds.reply, mpi_reply, mpi_reply->MsgLength*4);
290  ioc->ctl_cmds.status |= MPT2_CMD_REPLY_VALID;
291  /* get sense data */
292  if (mpi_reply->Function == MPI2_FUNCTION_SCSI_IO_REQUEST ||
293  mpi_reply->Function ==
295  scsiio_reply = (Mpi2SCSIIOReply_t *)mpi_reply;
296  if (scsiio_reply->SCSIState &
299  le32_to_cpu(scsiio_reply->SenseCount));
300  sense_data = mpt2sas_base_get_sense_buffer(ioc,
301  smid);
302  memcpy(ioc->ctl_cmds.sense, sense_data, sz);
303  }
304  }
305  }
306 #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
307  _ctl_display_some_debug(ioc, smid, "ctl_done", mpi_reply);
308 #endif
309  ioc->ctl_cmds.status &= ~MPT2_CMD_PENDING;
310  complete(&ioc->ctl_cmds.done);
311  return 1;
312 }
313 
324 static int
325 _ctl_check_event_type(struct MPT2SAS_ADAPTER *ioc, u16 event)
326 {
327  u16 i;
328  u32 desired_event;
329 
330  if (event >= 128 || !event || !ioc->event_log)
331  return 0;
332 
333  desired_event = (1 << (event % 32));
334  if (!desired_event)
335  desired_event = 1;
336  i = event / 32;
337  return desired_event & ioc->event_type[i];
338 }
339 
347 void
349  Mpi2EventNotificationReply_t *mpi_reply)
350 {
351  struct MPT2_IOCTL_EVENTS *event_log;
352  u16 event;
353  int i;
354  u32 sz, event_data_sz;
355  u8 send_aen = 0;
356 
357  if (!ioc->event_log)
358  return;
359 
360  event = le16_to_cpu(mpi_reply->Event);
361 
362  if (_ctl_check_event_type(ioc, event)) {
363 
364  /* insert entry into circular event_log */
366  event_log = ioc->event_log;
367  event_log[i].event = event;
368  event_log[i].context = ioc->event_context++;
369 
370  event_data_sz = le16_to_cpu(mpi_reply->EventDataLength)*4;
371  sz = min_t(u32, event_data_sz, MPT2_EVENT_DATA_SIZE);
372  memset(event_log[i].data, 0, MPT2_EVENT_DATA_SIZE);
373  memcpy(event_log[i].data, mpi_reply->EventData, sz);
374  send_aen = 1;
375  }
376 
377  /* This aen_event_read_flag flag is set until the
378  * application has read the event log.
379  * For MPI2_EVENT_LOG_ENTRY_ADDED, we always notify.
380  */
381  if (event == MPI2_EVENT_LOG_ENTRY_ADDED ||
382  (send_aen && !ioc->aen_event_read_flag)) {
383  ioc->aen_event_read_flag = 1;
384  wake_up_interruptible(&ctl_poll_wait);
385  if (async_queue)
386  kill_fasync(&async_queue, SIGIO, POLL_IN);
387  }
388 }
389 
403 u8
405  u32 reply)
406 {
407  Mpi2EventNotificationReply_t *mpi_reply;
408 
409  mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
410  mpt2sas_ctl_add_to_event_log(ioc, mpi_reply);
411  return 1;
412 }
413 
421 static int
422 _ctl_verify_adapter(int ioc_number, struct MPT2SAS_ADAPTER **iocpp)
423 {
424  struct MPT2SAS_ADAPTER *ioc;
425 
426  list_for_each_entry(ioc, &mpt2sas_ioc_list, list) {
427  if (ioc->id != ioc_number)
428  continue;
429  *iocpp = ioc;
430  return ioc_number;
431  }
432  *iocpp = NULL;
433  return -1;
434 }
435 
446 void
447 mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
448 {
449  int i;
450  u8 issue_reset;
451 
452  switch (reset_phase) {
453  case MPT2_IOC_PRE_RESET:
454  dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
455  "MPT2_IOC_PRE_RESET\n", ioc->name, __func__));
456  for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
457  if (!(ioc->diag_buffer_status[i] &
459  continue;
460  if ((ioc->diag_buffer_status[i] &
462  continue;
463  _ctl_send_release(ioc, i, &issue_reset);
464  }
465  break;
467  dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
468  "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__));
469  if (ioc->ctl_cmds.status & MPT2_CMD_PENDING) {
470  ioc->ctl_cmds.status |= MPT2_CMD_RESET;
471  mpt2sas_base_free_smid(ioc, ioc->ctl_cmds.smid);
472  complete(&ioc->ctl_cmds.done);
473  }
474  break;
475  case MPT2_IOC_DONE_RESET:
476  dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
477  "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
478 
479  for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
480  if (!(ioc->diag_buffer_status[i] &
482  continue;
483  if ((ioc->diag_buffer_status[i] &
485  continue;
486  ioc->diag_buffer_status[i] |=
488  }
489  break;
490  }
491 }
492 
501 static int
502 _ctl_fasync(int fd, struct file *filep, int mode)
503 {
504  return fasync_helper(fd, filep, mode, &async_queue);
505 }
506 
514 static int
515 _ctl_release(struct inode *inode, struct file *filep)
516 {
517  return fasync_helper(-1, filep, 0, &async_queue);
518 }
519 
526 static unsigned int
527 _ctl_poll(struct file *filep, poll_table *wait)
528 {
529  struct MPT2SAS_ADAPTER *ioc;
530 
531  poll_wait(filep, &ctl_poll_wait, wait);
532 
533  list_for_each_entry(ioc, &mpt2sas_ioc_list, list) {
534  if (ioc->aen_event_read_flag)
535  return POLLIN | POLLRDNORM;
536  }
537  return 0;
538 }
539 
549 static int
550 _ctl_set_task_mid(struct MPT2SAS_ADAPTER *ioc, struct mpt2_ioctl_command *karg,
552 {
553  u8 found = 0;
554  u16 i;
555  u16 handle;
556  struct scsi_cmnd *scmd;
557  struct MPT2SAS_DEVICE *priv_data;
558  unsigned long flags;
560  u32 sz;
561  u32 lun;
562  char *desc = NULL;
563 
565  desc = "abort_task";
566  else if (tm_request->TaskType == MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK)
567  desc = "query_task";
568  else
569  return 0;
570 
571  lun = scsilun_to_int((struct scsi_lun *)tm_request->LUN);
572 
573  handle = le16_to_cpu(tm_request->DevHandle);
574  spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
575  for (i = ioc->scsiio_depth; i && !found; i--) {
576  scmd = ioc->scsi_lookup[i - 1].scmd;
577  if (scmd == NULL || scmd->device == NULL ||
578  scmd->device->hostdata == NULL)
579  continue;
580  if (lun != scmd->device->lun)
581  continue;
582  priv_data = scmd->device->hostdata;
583  if (priv_data->sas_target == NULL)
584  continue;
585  if (priv_data->sas_target->handle != handle)
586  continue;
587  tm_request->TaskMID = cpu_to_le16(ioc->scsi_lookup[i - 1].smid);
588  found = 1;
589  }
590  spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
591 
592  if (!found) {
594  "handle(0x%04x), lun(%d), no active mid!!\n", ioc->name,
595  desc, le16_to_cpu(tm_request->DevHandle), lun));
596  tm_reply = ioc->ctl_cmds.reply;
597  tm_reply->DevHandle = tm_request->DevHandle;
599  tm_reply->TaskType = tm_request->TaskType;
600  tm_reply->MsgLength = sizeof(Mpi2SCSITaskManagementReply_t)/4;
601  tm_reply->VP_ID = tm_request->VP_ID;
602  tm_reply->VF_ID = tm_request->VF_ID;
603  sz = min_t(u32, karg->max_reply_bytes, ioc->reply_sz);
604  if (copy_to_user(karg->reply_frame_buf_ptr, ioc->ctl_cmds.reply,
605  sz))
606  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
607  __LINE__, __func__);
608  return 1;
609  }
610 
612  "handle(0x%04x), lun(%d), task_mid(%d)\n", ioc->name,
613  desc, le16_to_cpu(tm_request->DevHandle), lun,
614  le16_to_cpu(tm_request->TaskMID)));
615  return 0;
616 }
617 
624 static long
625 _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, struct mpt2_ioctl_command karg,
626  void __user *mf)
627 {
628  MPI2RequestHeader_t *mpi_request = NULL, *request;
629  MPI2DefaultReply_t *mpi_reply;
630  u32 ioc_state;
631  u16 ioc_status;
632  u16 smid;
633  unsigned long timeout, timeleft;
634  u8 issue_reset;
635  u32 sz;
636  void *psge;
637  void *data_out = NULL;
638  dma_addr_t data_out_dma;
639  size_t data_out_sz = 0;
640  void *data_in = NULL;
641  dma_addr_t data_in_dma;
642  size_t data_in_sz = 0;
643  u32 sgl_flags;
644  long ret;
645  u16 wait_state_count;
646 
647  issue_reset = 0;
648 
649  if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
650  printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
651  ioc->name, __func__);
652  ret = -EAGAIN;
653  goto out;
654  }
655 
656  wait_state_count = 0;
657  ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
658  while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
659  if (wait_state_count++ == 10) {
661  "%s: failed due to ioc not operational\n",
662  ioc->name, __func__);
663  ret = -EFAULT;
664  goto out;
665  }
666  ssleep(1);
667  ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
668  printk(MPT2SAS_INFO_FMT "%s: waiting for "
669  "operational state(count=%d)\n", ioc->name,
670  __func__, wait_state_count);
671  }
672  if (wait_state_count)
673  printk(MPT2SAS_INFO_FMT "%s: ioc is operational\n",
674  ioc->name, __func__);
675 
676  mpi_request = kzalloc(ioc->request_sz, GFP_KERNEL);
677  if (!mpi_request) {
678  printk(MPT2SAS_ERR_FMT "%s: failed obtaining a memory for "
679  "mpi_request\n", ioc->name, __func__);
680  ret = -ENOMEM;
681  goto out;
682  }
683 
684  /* Check for overflow and wraparound */
685  if (karg.data_sge_offset * 4 > ioc->request_sz ||
686  karg.data_sge_offset > (UINT_MAX / 4)) {
687  ret = -EINVAL;
688  goto out;
689  }
690 
691  /* copy in request message frame from user */
692  if (copy_from_user(mpi_request, mf, karg.data_sge_offset*4)) {
693  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, __LINE__,
694  __func__);
695  ret = -EFAULT;
696  goto out;
697  }
698 
699  if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) {
700  smid = mpt2sas_base_get_smid_hpr(ioc, ioc->ctl_cb_idx);
701  if (!smid) {
702  printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
703  ioc->name, __func__);
704  ret = -EAGAIN;
705  goto out;
706  }
707  } else {
708 
709  smid = mpt2sas_base_get_smid_scsiio(ioc, ioc->ctl_cb_idx, NULL);
710  if (!smid) {
711  printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
712  ioc->name, __func__);
713  ret = -EAGAIN;
714  goto out;
715  }
716  }
717 
718  ret = 0;
719  ioc->ctl_cmds.status = MPT2_CMD_PENDING;
720  memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
721  request = mpt2sas_base_get_msg_frame(ioc, smid);
722  memcpy(request, mpi_request, karg.data_sge_offset*4);
723  ioc->ctl_cmds.smid = smid;
724  data_out_sz = karg.data_out_size;
725  data_in_sz = karg.data_in_size;
726 
727  if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST ||
729  if (!le16_to_cpu(mpi_request->FunctionDependent1) ||
730  le16_to_cpu(mpi_request->FunctionDependent1) >
731  ioc->facts.MaxDevHandle) {
732  ret = -EINVAL;
733  mpt2sas_base_free_smid(ioc, smid);
734  goto out;
735  }
736  }
737 
738  /* obtain dma-able memory for data transfer */
739  if (data_out_sz) /* WRITE */ {
740  data_out = pci_alloc_consistent(ioc->pdev, data_out_sz,
741  &data_out_dma);
742  if (!data_out) {
743  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
744  __LINE__, __func__);
745  ret = -ENOMEM;
746  mpt2sas_base_free_smid(ioc, smid);
747  goto out;
748  }
749  if (copy_from_user(data_out, karg.data_out_buf_ptr,
750  data_out_sz)) {
751  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
752  __LINE__, __func__);
753  ret = -EFAULT;
754  mpt2sas_base_free_smid(ioc, smid);
755  goto out;
756  }
757  }
758 
759  if (data_in_sz) /* READ */ {
760  data_in = pci_alloc_consistent(ioc->pdev, data_in_sz,
761  &data_in_dma);
762  if (!data_in) {
763  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
764  __LINE__, __func__);
765  ret = -ENOMEM;
766  mpt2sas_base_free_smid(ioc, smid);
767  goto out;
768  }
769  }
770 
771  /* add scatter gather elements */
772  psge = (void *)request + (karg.data_sge_offset*4);
773 
774  if (!data_out_sz && !data_in_sz) {
776  } else if (data_out_sz && data_in_sz) {
777  /* WRITE sgel first */
778  sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
780  sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT;
781  ioc->base_add_sg_single(psge, sgl_flags |
782  data_out_sz, data_out_dma);
783 
784  /* incr sgel */
785  psge += ioc->sge_size;
786 
787  /* READ sgel last */
788  sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
791  sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT;
792  ioc->base_add_sg_single(psge, sgl_flags |
793  data_in_sz, data_in_dma);
794  } else if (data_out_sz) /* WRITE */ {
795  sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
798  sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT;
799  ioc->base_add_sg_single(psge, sgl_flags |
800  data_out_sz, data_out_dma);
801  } else if (data_in_sz) /* READ */ {
802  sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
805  sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT;
806  ioc->base_add_sg_single(psge, sgl_flags |
807  data_in_sz, data_in_dma);
808  }
809 
810  /* send command to firmware */
811 #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
812  _ctl_display_some_debug(ioc, smid, "ctl_request", NULL);
813 #endif
814 
815  init_completion(&ioc->ctl_cmds.done);
816  switch (mpi_request->Function) {
819  {
820  Mpi2SCSIIORequest_t *scsiio_request =
821  (Mpi2SCSIIORequest_t *)request;
822  scsiio_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE;
823  scsiio_request->SenseBufferLowAddress =
825  memset(ioc->ctl_cmds.sense, 0, SCSI_SENSE_BUFFERSIZE);
826  if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST)
828  le16_to_cpu(mpi_request->FunctionDependent1));
829  else
831  break;
832  }
834  {
835  Mpi2SCSITaskManagementRequest_t *tm_request =
837 
838  dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "TASK_MGMT: "
839  "handle(0x%04x), task_type(0x%02x)\n", ioc->name,
840  le16_to_cpu(tm_request->DevHandle), tm_request->TaskType));
841 
842  if (tm_request->TaskType ==
844  tm_request->TaskType ==
846  if (_ctl_set_task_mid(ioc, &karg, tm_request)) {
847  mpt2sas_base_free_smid(ioc, smid);
848  goto out;
849  }
850  }
851 
853  tm_request->DevHandle));
855  break;
856  }
858  {
859  Mpi2SmpPassthroughRequest_t *smp_request =
860  (Mpi2SmpPassthroughRequest_t *)mpi_request;
861  u8 *data;
862 
863  /* ioc determines which port to use */
864  smp_request->PhysicalPort = 0xFF;
865  if (smp_request->PassthroughFlags &
867  data = (u8 *)&smp_request->SGL;
868  else {
869  if (unlikely(data_out == NULL)) {
870  printk(KERN_ERR "failure at %s:%d/%s()!\n",
871  __FILE__, __LINE__, __func__);
872  mpt2sas_base_free_smid(ioc, smid);
873  ret = -EINVAL;
874  goto out;
875  }
876  data = data_out;
877  }
878 
879  if (data[1] == 0x91 && (data[10] == 1 || data[10] == 2)) {
881  ioc->ignore_loginfos = 1;
882  }
884  break;
885  }
887  {
888  Mpi2SasIoUnitControlRequest_t *sasiounit_request =
889  (Mpi2SasIoUnitControlRequest_t *)mpi_request;
890 
891  if (sasiounit_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET
892  || sasiounit_request->Operation ==
895  ioc->ignore_loginfos = 1;
896  }
898  break;
899  }
900  default:
902  break;
903  }
904 
906  timeout = MPT2_IOCTL_DEFAULT_TIMEOUT;
907  else
908  timeout = karg.timeout;
909  timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
910  timeout*HZ);
911  if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) {
912  Mpi2SCSITaskManagementRequest_t *tm_request =
913  (Mpi2SCSITaskManagementRequest_t *)mpi_request;
915  tm_request->DevHandle));
916  } else if ((mpi_request->Function == MPI2_FUNCTION_SMP_PASSTHROUGH ||
917  mpi_request->Function == MPI2_FUNCTION_SAS_IO_UNIT_CONTROL) &&
920  ioc->ignore_loginfos = 0;
921  }
922  if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) {
923  printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name,
924  __func__);
925  _debug_dump_mf(mpi_request, karg.data_sge_offset);
926  if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
927  issue_reset = 1;
928  goto issue_host_reset;
929  }
930 
931  mpi_reply = ioc->ctl_cmds.reply;
932  ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK;
933 
934 #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
935  if (mpi_reply->Function == MPI2_FUNCTION_SCSI_TASK_MGMT &&
936  (ioc->logging_level & MPT_DEBUG_TM)) {
938  (Mpi2SCSITaskManagementReply_t *)mpi_reply;
939 
940  printk(MPT2SAS_INFO_FMT "TASK_MGMT: "
941  "IOCStatus(0x%04x), IOCLogInfo(0x%08x), "
942  "TerminationCount(0x%08x)\n", ioc->name,
943  le16_to_cpu(tm_reply->IOCStatus),
944  le32_to_cpu(tm_reply->IOCLogInfo),
945  le32_to_cpu(tm_reply->TerminationCount));
946  }
947 #endif
948  /* copy out xdata to user */
949  if (data_in_sz) {
950  if (copy_to_user(karg.data_in_buf_ptr, data_in,
951  data_in_sz)) {
952  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
953  __LINE__, __func__);
954  ret = -ENODATA;
955  goto out;
956  }
957  }
958 
959  /* copy out reply message frame to user */
960  if (karg.max_reply_bytes) {
961  sz = min_t(u32, karg.max_reply_bytes, ioc->reply_sz);
962  if (copy_to_user(karg.reply_frame_buf_ptr, ioc->ctl_cmds.reply,
963  sz)) {
964  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
965  __LINE__, __func__);
966  ret = -ENODATA;
967  goto out;
968  }
969  }
970 
971  /* copy out sense to user */
972  if (karg.max_sense_bytes && (mpi_request->Function ==
973  MPI2_FUNCTION_SCSI_IO_REQUEST || mpi_request->Function ==
976  if (copy_to_user(karg.sense_data_ptr,
977  ioc->ctl_cmds.sense, sz)) {
978  printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__,
979  __LINE__, __func__);
980  ret = -ENODATA;
981  goto out;
982  }
983  }
984 
985  issue_host_reset:
986  if (issue_reset) {
987  ret = -ENODATA;
988  if ((mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST ||
989  mpi_request->Function ==
991  mpi_request->Function == MPI2_FUNCTION_SATA_PASSTHROUGH)) {
992  printk(MPT2SAS_INFO_FMT "issue target reset: handle "
993  "= (0x%04x)\n", ioc->name,
994  le16_to_cpu(mpi_request->FunctionDependent1));
997  le16_to_cpu(mpi_request->FunctionDependent1), 0, 0,
999  0, TM_MUTEX_ON);
1000  ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
1001  } else
1004  }
1005 
1006  out:
1007 
1008  /* free memory associated with sg buffers */
1009  if (data_in)
1010  pci_free_consistent(ioc->pdev, data_in_sz, data_in,
1011  data_in_dma);
1012 
1013  if (data_out)
1014  pci_free_consistent(ioc->pdev, data_out_sz, data_out,
1015  data_out_dma);
1016 
1017  kfree(mpi_request);
1018  ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
1019  return ret;
1020 }
1021 
1027 static long
1028 _ctl_getiocinfo(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1029 {
1030  struct mpt2_ioctl_iocinfo karg;
1031 
1032  if (copy_from_user(&karg, arg, sizeof(karg))) {
1033  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1034  __FILE__, __LINE__, __func__);
1035  return -EFAULT;
1036  }
1037 
1038  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name,
1039  __func__));
1040 
1041  memset(&karg, 0 , sizeof(karg));
1042  if (ioc->is_warpdrive)
1043  karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2_SSS6200;
1044  else
1045  karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2;
1046  if (ioc->pfacts)
1047  karg.port_number = ioc->pfacts[0].PortNumber;
1048  karg.hw_rev = ioc->pdev->revision;
1049  karg.pci_id = ioc->pdev->device;
1050  karg.subsystem_device = ioc->pdev->subsystem_device;
1051  karg.subsystem_vendor = ioc->pdev->subsystem_vendor;
1052  karg.pci_information.u.bits.bus = ioc->pdev->bus->number;
1053  karg.pci_information.u.bits.device = PCI_SLOT(ioc->pdev->devfn);
1054  karg.pci_information.u.bits.function = PCI_FUNC(ioc->pdev->devfn);
1055  karg.pci_information.segment_id = pci_domain_nr(ioc->pdev->bus);
1056  karg.firmware_version = ioc->facts.FWVersion.Word;
1057  strcpy(karg.driver_version, MPT2SAS_DRIVER_NAME);
1058  strcat(karg.driver_version, "-");
1059  strcat(karg.driver_version, MPT2SAS_DRIVER_VERSION);
1060  karg.bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion);
1061 
1062  if (copy_to_user(arg, &karg, sizeof(karg))) {
1063  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1064  __FILE__, __LINE__, __func__);
1065  return -EFAULT;
1066  }
1067  return 0;
1068 }
1069 
1075 static long
1076 _ctl_eventquery(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1077 {
1078  struct mpt2_ioctl_eventquery karg;
1079 
1080  if (copy_from_user(&karg, arg, sizeof(karg))) {
1081  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1082  __FILE__, __LINE__, __func__);
1083  return -EFAULT;
1084  }
1085 
1086  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name,
1087  __func__));
1088 
1089  karg.event_entries = MPT2SAS_CTL_EVENT_LOG_SIZE;
1090  memcpy(karg.event_types, ioc->event_type,
1092 
1093  if (copy_to_user(arg, &karg, sizeof(karg))) {
1094  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1095  __FILE__, __LINE__, __func__);
1096  return -EFAULT;
1097  }
1098  return 0;
1099 }
1100 
1106 static long
1107 _ctl_eventenable(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1108 {
1109  struct mpt2_ioctl_eventenable karg;
1110 
1111  if (copy_from_user(&karg, arg, sizeof(karg))) {
1112  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1113  __FILE__, __LINE__, __func__);
1114  return -EFAULT;
1115  }
1116 
1117  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name,
1118  __func__));
1119 
1120  if (ioc->event_log)
1121  return 0;
1122  memcpy(ioc->event_type, karg.event_types,
1125 
1126  /* initialize event_log */
1127  ioc->event_context = 0;
1128  ioc->aen_event_read_flag = 0;
1129  ioc->event_log = kcalloc(MPT2SAS_CTL_EVENT_LOG_SIZE,
1130  sizeof(struct MPT2_IOCTL_EVENTS), GFP_KERNEL);
1131  if (!ioc->event_log) {
1132  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1133  __FILE__, __LINE__, __func__);
1134  return -ENOMEM;
1135  }
1136  return 0;
1137 }
1138 
1144 static long
1145 _ctl_eventreport(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1146 {
1147  struct mpt2_ioctl_eventreport karg;
1148  u32 number_bytes, max_events, max;
1149  struct mpt2_ioctl_eventreport __user *uarg = arg;
1150 
1151  if (copy_from_user(&karg, arg, sizeof(karg))) {
1152  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1153  __FILE__, __LINE__, __func__);
1154  return -EFAULT;
1155  }
1156 
1157  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name,
1158  __func__));
1159 
1160  number_bytes = karg.hdr.max_data_size -
1161  sizeof(struct mpt2_ioctl_header);
1162  max_events = number_bytes/sizeof(struct MPT2_IOCTL_EVENTS);
1163  max = min_t(u32, MPT2SAS_CTL_EVENT_LOG_SIZE, max_events);
1164 
1165  /* If fewer than 1 event is requested, there must have
1166  * been some type of error.
1167  */
1168  if (!max || !ioc->event_log)
1169  return -ENODATA;
1170 
1171  number_bytes = max * sizeof(struct MPT2_IOCTL_EVENTS);
1172  if (copy_to_user(uarg->event_data, ioc->event_log, number_bytes)) {
1173  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1174  __FILE__, __LINE__, __func__);
1175  return -EFAULT;
1176  }
1177 
1178  /* reset flag so SIGIO can restart */
1179  ioc->aen_event_read_flag = 0;
1180  return 0;
1181 }
1182 
1188 static long
1189 _ctl_do_reset(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1190 {
1191  struct mpt2_ioctl_diag_reset karg;
1192  int retval;
1193 
1194  if (copy_from_user(&karg, arg, sizeof(karg))) {
1195  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1196  __FILE__, __LINE__, __func__);
1197  return -EFAULT;
1198  }
1199 
1200  if (ioc->shost_recovery || ioc->pci_error_recovery ||
1201  ioc->is_driver_loading)
1202  return -EAGAIN;
1203  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name,
1204  __func__));
1205 
1208  printk(MPT2SAS_INFO_FMT "host reset: %s\n",
1209  ioc->name, ((!retval) ? "SUCCESS" : "FAILED"));
1210  return 0;
1211 }
1212 
1218 static int
1219 _ctl_btdh_search_sas_device(struct MPT2SAS_ADAPTER *ioc,
1220  struct mpt2_ioctl_btdh_mapping *btdh)
1221 {
1222  struct _sas_device *sas_device;
1223  unsigned long flags;
1224  int rc = 0;
1225 
1226  if (list_empty(&ioc->sas_device_list))
1227  return rc;
1228 
1229  spin_lock_irqsave(&ioc->sas_device_lock, flags);
1230  list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
1231  if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF &&
1232  btdh->handle == sas_device->handle) {
1233  btdh->bus = sas_device->channel;
1234  btdh->id = sas_device->id;
1235  rc = 1;
1236  goto out;
1237  } else if (btdh->bus == sas_device->channel && btdh->id ==
1238  sas_device->id && btdh->handle == 0xFFFF) {
1239  btdh->handle = sas_device->handle;
1240  rc = 1;
1241  goto out;
1242  }
1243  }
1244  out:
1245  spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1246  return rc;
1247 }
1248 
1254 static int
1255 _ctl_btdh_search_raid_device(struct MPT2SAS_ADAPTER *ioc,
1256  struct mpt2_ioctl_btdh_mapping *btdh)
1257 {
1258  struct _raid_device *raid_device;
1259  unsigned long flags;
1260  int rc = 0;
1261 
1262  if (list_empty(&ioc->raid_device_list))
1263  return rc;
1264 
1265  spin_lock_irqsave(&ioc->raid_device_lock, flags);
1266  list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
1267  if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF &&
1268  btdh->handle == raid_device->handle) {
1269  btdh->bus = raid_device->channel;
1270  btdh->id = raid_device->id;
1271  rc = 1;
1272  goto out;
1273  } else if (btdh->bus == raid_device->channel && btdh->id ==
1274  raid_device->id && btdh->handle == 0xFFFF) {
1275  btdh->handle = raid_device->handle;
1276  rc = 1;
1277  goto out;
1278  }
1279  }
1280  out:
1281  spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1282  return rc;
1283 }
1284 
1290 static long
1291 _ctl_btdh_mapping(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1292 {
1293  struct mpt2_ioctl_btdh_mapping karg;
1294  int rc;
1295 
1296  if (copy_from_user(&karg, arg, sizeof(karg))) {
1297  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1298  __FILE__, __LINE__, __func__);
1299  return -EFAULT;
1300  }
1301 
1302  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1303  __func__));
1304 
1305  rc = _ctl_btdh_search_sas_device(ioc, &karg);
1306  if (!rc)
1307  _ctl_btdh_search_raid_device(ioc, &karg);
1308 
1309  if (copy_to_user(arg, &karg, sizeof(karg))) {
1310  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1311  __FILE__, __LINE__, __func__);
1312  return -EFAULT;
1313  }
1314  return 0;
1315 }
1316 
1324 static u8
1325 _ctl_diag_capability(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type)
1326 {
1327  u8 rc = 0;
1328 
1329  switch (buffer_type) {
1331  if (ioc->facts.IOCCapabilities &
1333  rc = 1;
1334  break;
1336  if (ioc->facts.IOCCapabilities &
1338  rc = 1;
1339  break;
1341  if (ioc->facts.IOCCapabilities &
1343  rc = 1;
1344  }
1345 
1346  return rc;
1347 }
1348 
1355 static long
1356 _ctl_diag_register_2(struct MPT2SAS_ADAPTER *ioc,
1357  struct mpt2_diag_register *diag_register)
1358 {
1359  int rc, i;
1360  void *request_data = NULL;
1361  dma_addr_t request_data_dma;
1362  u32 request_data_sz = 0;
1363  Mpi2DiagBufferPostRequest_t *mpi_request;
1364  Mpi2DiagBufferPostReply_t *mpi_reply;
1365  u8 buffer_type;
1366  unsigned long timeleft;
1367  u16 smid;
1368  u16 ioc_status;
1369  u8 issue_reset = 0;
1370 
1371  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1372  __func__));
1373 
1374  if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
1375  printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
1376  ioc->name, __func__);
1377  rc = -EAGAIN;
1378  goto out;
1379  }
1380 
1381  buffer_type = diag_register->buffer_type;
1382  if (!_ctl_diag_capability(ioc, buffer_type)) {
1383  printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
1384  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1385  return -EPERM;
1386  }
1387 
1388  if (ioc->diag_buffer_status[buffer_type] &
1390  printk(MPT2SAS_ERR_FMT "%s: already has a registered "
1391  "buffer for buffer_type(0x%02x)\n", ioc->name, __func__,
1392  buffer_type);
1393  return -EINVAL;
1394  }
1395 
1396  if (diag_register->requested_buffer_size % 4) {
1397  printk(MPT2SAS_ERR_FMT "%s: the requested_buffer_size "
1398  "is not 4 byte aligned\n", ioc->name, __func__);
1399  return -EINVAL;
1400  }
1401 
1402  smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx);
1403  if (!smid) {
1404  printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
1405  ioc->name, __func__);
1406  rc = -EAGAIN;
1407  goto out;
1408  }
1409 
1410  rc = 0;
1411  ioc->ctl_cmds.status = MPT2_CMD_PENDING;
1412  memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
1413  mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
1414  ioc->ctl_cmds.smid = smid;
1415 
1416  request_data = ioc->diag_buffer[buffer_type];
1417  request_data_sz = diag_register->requested_buffer_size;
1418  ioc->unique_id[buffer_type] = diag_register->unique_id;
1419  ioc->diag_buffer_status[buffer_type] = 0;
1420  memcpy(ioc->product_specific[buffer_type],
1422  ioc->diagnostic_flags[buffer_type] = diag_register->diagnostic_flags;
1423 
1424  if (request_data) {
1425  request_data_dma = ioc->diag_buffer_dma[buffer_type];
1426  if (request_data_sz != ioc->diag_buffer_sz[buffer_type]) {
1428  ioc->diag_buffer_sz[buffer_type],
1429  request_data, request_data_dma);
1430  request_data = NULL;
1431  }
1432  }
1433 
1434  if (request_data == NULL) {
1435  ioc->diag_buffer_sz[buffer_type] = 0;
1436  ioc->diag_buffer_dma[buffer_type] = 0;
1437  request_data = pci_alloc_consistent(
1438  ioc->pdev, request_data_sz, &request_data_dma);
1439  if (request_data == NULL) {
1440  printk(MPT2SAS_ERR_FMT "%s: failed allocating memory"
1441  " for diag buffers, requested size(%d)\n",
1442  ioc->name, __func__, request_data_sz);
1443  mpt2sas_base_free_smid(ioc, smid);
1444  return -ENOMEM;
1445  }
1446  ioc->diag_buffer[buffer_type] = request_data;
1447  ioc->diag_buffer_sz[buffer_type] = request_data_sz;
1448  ioc->diag_buffer_dma[buffer_type] = request_data_dma;
1449  }
1450 
1452  mpi_request->BufferType = diag_register->buffer_type;
1453  mpi_request->Flags = cpu_to_le32(diag_register->diagnostic_flags);
1454  mpi_request->BufferAddress = cpu_to_le64(request_data_dma);
1455  mpi_request->BufferLength = cpu_to_le32(request_data_sz);
1456  mpi_request->VF_ID = 0; /* TODO */
1457  mpi_request->VP_ID = 0;
1458 
1459  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: diag_buffer(0x%p), "
1460  "dma(0x%llx), sz(%d)\n", ioc->name, __func__, request_data,
1461  (unsigned long long)request_data_dma,
1462  le32_to_cpu(mpi_request->BufferLength)));
1463 
1464  for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++)
1465  mpi_request->ProductSpecific[i] =
1466  cpu_to_le32(ioc->product_specific[buffer_type][i]);
1467 
1468  init_completion(&ioc->ctl_cmds.done);
1469  mpt2sas_base_put_smid_default(ioc, smid);
1470  timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
1472 
1473  if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) {
1474  printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name,
1475  __func__);
1476  _debug_dump_mf(mpi_request,
1477  sizeof(Mpi2DiagBufferPostRequest_t)/4);
1478  if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
1479  issue_reset = 1;
1480  goto issue_host_reset;
1481  }
1482 
1483  /* process the completed Reply Message Frame */
1484  if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) {
1485  printk(MPT2SAS_ERR_FMT "%s: no reply message\n",
1486  ioc->name, __func__);
1487  rc = -EFAULT;
1488  goto out;
1489  }
1490 
1491  mpi_reply = ioc->ctl_cmds.reply;
1492  ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK;
1493 
1494  if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
1497  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: success\n",
1498  ioc->name, __func__));
1499  } else {
1500  printk(MPT2SAS_INFO_FMT "%s: ioc_status(0x%04x) "
1501  "log_info(0x%08x)\n", ioc->name, __func__,
1502  ioc_status, le32_to_cpu(mpi_reply->IOCLogInfo));
1503  rc = -EFAULT;
1504  }
1505 
1506  issue_host_reset:
1507  if (issue_reset)
1510 
1511  out:
1512 
1513  if (rc && request_data)
1514  pci_free_consistent(ioc->pdev, request_data_sz,
1515  request_data, request_data_dma);
1516 
1517  ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
1518  return rc;
1519 }
1520 
1529 void
1530 mpt2sas_enable_diag_buffer(struct MPT2SAS_ADAPTER *ioc, u8 bits_to_register)
1531 {
1532  struct mpt2_diag_register diag_register;
1533 
1534  memset(&diag_register, 0, sizeof(struct mpt2_diag_register));
1535 
1536  if (bits_to_register & 1) {
1537  printk(MPT2SAS_INFO_FMT "registering trace buffer support\n",
1538  ioc->name);
1539  diag_register.buffer_type = MPI2_DIAG_BUF_TYPE_TRACE;
1540  /* register for 1MB buffers */
1541  diag_register.requested_buffer_size = (1024 * 1024);
1542  diag_register.unique_id = 0x7075900;
1543  _ctl_diag_register_2(ioc, &diag_register);
1544  }
1545 
1546  if (bits_to_register & 2) {
1547  printk(MPT2SAS_INFO_FMT "registering snapshot buffer support\n",
1548  ioc->name);
1549  diag_register.buffer_type = MPI2_DIAG_BUF_TYPE_SNAPSHOT;
1550  /* register for 2MB buffers */
1551  diag_register.requested_buffer_size = 2 * (1024 * 1024);
1552  diag_register.unique_id = 0x7075901;
1553  _ctl_diag_register_2(ioc, &diag_register);
1554  }
1555 
1556  if (bits_to_register & 4) {
1557  printk(MPT2SAS_INFO_FMT "registering extended buffer support\n",
1558  ioc->name);
1559  diag_register.buffer_type = MPI2_DIAG_BUF_TYPE_EXTENDED;
1560  /* register for 2MB buffers */
1561  diag_register.requested_buffer_size = 2 * (1024 * 1024);
1562  diag_register.unique_id = 0x7075901;
1563  _ctl_diag_register_2(ioc, &diag_register);
1564  }
1565 }
1566 
1575 static long
1576 _ctl_diag_register(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1577 {
1578  struct mpt2_diag_register karg;
1579  long rc;
1580 
1581  if (copy_from_user(&karg, arg, sizeof(karg))) {
1582  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1583  __FILE__, __LINE__, __func__);
1584  return -EFAULT;
1585  }
1586 
1587  rc = _ctl_diag_register_2(ioc, &karg);
1588  return rc;
1589 }
1590 
1599 static long
1600 _ctl_diag_unregister(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1601 {
1602  struct mpt2_diag_unregister karg;
1603  void *request_data;
1604  dma_addr_t request_data_dma;
1605  u32 request_data_sz;
1606  u8 buffer_type;
1607 
1608  if (copy_from_user(&karg, arg, sizeof(karg))) {
1609  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1610  __FILE__, __LINE__, __func__);
1611  return -EFAULT;
1612  }
1613 
1614  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1615  __func__));
1616 
1617  buffer_type = karg.unique_id & 0x000000ff;
1618  if (!_ctl_diag_capability(ioc, buffer_type)) {
1619  printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
1620  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1621  return -EPERM;
1622  }
1623 
1624  if ((ioc->diag_buffer_status[buffer_type] &
1625  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
1626  printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not "
1627  "registered\n", ioc->name, __func__, buffer_type);
1628  return -EINVAL;
1629  }
1630  if ((ioc->diag_buffer_status[buffer_type] &
1632  printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) has not been "
1633  "released\n", ioc->name, __func__, buffer_type);
1634  return -EINVAL;
1635  }
1636 
1637  if (karg.unique_id != ioc->unique_id[buffer_type]) {
1638  printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not "
1639  "registered\n", ioc->name, __func__, karg.unique_id);
1640  return -EINVAL;
1641  }
1642 
1643  request_data = ioc->diag_buffer[buffer_type];
1644  if (!request_data) {
1645  printk(MPT2SAS_ERR_FMT "%s: doesn't have memory allocated for "
1646  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1647  return -ENOMEM;
1648  }
1649 
1650  request_data_sz = ioc->diag_buffer_sz[buffer_type];
1651  request_data_dma = ioc->diag_buffer_dma[buffer_type];
1652  pci_free_consistent(ioc->pdev, request_data_sz,
1653  request_data, request_data_dma);
1654  ioc->diag_buffer[buffer_type] = NULL;
1655  ioc->diag_buffer_status[buffer_type] = 0;
1656  return 0;
1657 }
1658 
1668 static long
1669 _ctl_diag_query(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1670 {
1671  struct mpt2_diag_query karg;
1672  void *request_data;
1673  int i;
1674  u8 buffer_type;
1675 
1676  if (copy_from_user(&karg, arg, sizeof(karg))) {
1677  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1678  __FILE__, __LINE__, __func__);
1679  return -EFAULT;
1680  }
1681 
1682  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1683  __func__));
1684 
1685  karg.application_flags = 0;
1686  buffer_type = karg.buffer_type;
1687 
1688  if (!_ctl_diag_capability(ioc, buffer_type)) {
1689  printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
1690  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1691  return -EPERM;
1692  }
1693 
1694  if ((ioc->diag_buffer_status[buffer_type] &
1695  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
1696  printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not "
1697  "registered\n", ioc->name, __func__, buffer_type);
1698  return -EINVAL;
1699  }
1700 
1701  if (karg.unique_id & 0xffffff00) {
1702  if (karg.unique_id != ioc->unique_id[buffer_type]) {
1703  printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not "
1704  "registered\n", ioc->name, __func__,
1705  karg.unique_id);
1706  return -EINVAL;
1707  }
1708  }
1709 
1710  request_data = ioc->diag_buffer[buffer_type];
1711  if (!request_data) {
1712  printk(MPT2SAS_ERR_FMT "%s: doesn't have buffer for "
1713  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1714  return -ENOMEM;
1715  }
1716 
1717  if (ioc->diag_buffer_status[buffer_type] & MPT2_DIAG_BUFFER_IS_RELEASED)
1718  karg.application_flags = (MPT2_APP_FLAGS_APP_OWNED |
1720  else
1721  karg.application_flags = (MPT2_APP_FLAGS_APP_OWNED |
1724 
1725  for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++)
1726  karg.product_specific[i] =
1727  ioc->product_specific[buffer_type][i];
1728 
1729  karg.total_buffer_size = ioc->diag_buffer_sz[buffer_type];
1730  karg.driver_added_buffer_size = 0;
1731  karg.unique_id = ioc->unique_id[buffer_type];
1732  karg.diagnostic_flags = ioc->diagnostic_flags[buffer_type];
1733 
1734  if (copy_to_user(arg, &karg, sizeof(struct mpt2_diag_query))) {
1735  printk(MPT2SAS_ERR_FMT "%s: unable to write mpt2_diag_query "
1736  "data @ %p\n", ioc->name, __func__, arg);
1737  return -EFAULT;
1738  }
1739  return 0;
1740 }
1741 
1749 static int
1750 _ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type, u8 *issue_reset)
1751 {
1752  Mpi2DiagReleaseRequest_t *mpi_request;
1753  Mpi2DiagReleaseReply_t *mpi_reply;
1754  u16 smid;
1755  u16 ioc_status;
1756  u32 ioc_state;
1757  int rc;
1758  unsigned long timeleft;
1759 
1760  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1761  __func__));
1762 
1763  rc = 0;
1764  *issue_reset = 0;
1765 
1766  ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
1767  if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
1768  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
1769  "skipping due to FAULT state\n", ioc->name,
1770  __func__));
1771  rc = -EAGAIN;
1772  goto out;
1773  }
1774 
1775  if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
1776  printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
1777  ioc->name, __func__);
1778  rc = -EAGAIN;
1779  goto out;
1780  }
1781 
1782  smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx);
1783  if (!smid) {
1784  printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
1785  ioc->name, __func__);
1786  rc = -EAGAIN;
1787  goto out;
1788  }
1789 
1790  ioc->ctl_cmds.status = MPT2_CMD_PENDING;
1791  memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
1792  mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
1793  ioc->ctl_cmds.smid = smid;
1794 
1795  mpi_request->Function = MPI2_FUNCTION_DIAG_RELEASE;
1796  mpi_request->BufferType = buffer_type;
1797  mpi_request->VF_ID = 0; /* TODO */
1798  mpi_request->VP_ID = 0;
1799 
1800  init_completion(&ioc->ctl_cmds.done);
1801  mpt2sas_base_put_smid_default(ioc, smid);
1802  timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
1804 
1805  if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) {
1806  printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name,
1807  __func__);
1808  _debug_dump_mf(mpi_request,
1809  sizeof(Mpi2DiagReleaseRequest_t)/4);
1810  if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
1811  *issue_reset = 1;
1812  rc = -EFAULT;
1813  goto out;
1814  }
1815 
1816  /* process the completed Reply Message Frame */
1817  if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) {
1818  printk(MPT2SAS_ERR_FMT "%s: no reply message\n",
1819  ioc->name, __func__);
1820  rc = -EFAULT;
1821  goto out;
1822  }
1823 
1824  mpi_reply = ioc->ctl_cmds.reply;
1825  ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK;
1826 
1827  if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
1830  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: success\n",
1831  ioc->name, __func__));
1832  } else {
1833  printk(MPT2SAS_INFO_FMT "%s: ioc_status(0x%04x) "
1834  "log_info(0x%08x)\n", ioc->name, __func__,
1835  ioc_status, le32_to_cpu(mpi_reply->IOCLogInfo));
1836  rc = -EFAULT;
1837  }
1838 
1839  out:
1840  ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
1841  return rc;
1842 }
1843 
1852 static long
1853 _ctl_diag_release(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1854 {
1855  struct mpt2_diag_release karg;
1856  void *request_data;
1857  int rc;
1858  u8 buffer_type;
1859  u8 issue_reset = 0;
1860 
1861  if (copy_from_user(&karg, arg, sizeof(karg))) {
1862  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1863  __FILE__, __LINE__, __func__);
1864  return -EFAULT;
1865  }
1866 
1867  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1868  __func__));
1869 
1870  buffer_type = karg.unique_id & 0x000000ff;
1871  if (!_ctl_diag_capability(ioc, buffer_type)) {
1872  printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
1873  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1874  return -EPERM;
1875  }
1876 
1877  if ((ioc->diag_buffer_status[buffer_type] &
1878  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
1879  printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not "
1880  "registered\n", ioc->name, __func__, buffer_type);
1881  return -EINVAL;
1882  }
1883 
1884  if (karg.unique_id != ioc->unique_id[buffer_type]) {
1885  printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not "
1886  "registered\n", ioc->name, __func__, karg.unique_id);
1887  return -EINVAL;
1888  }
1889 
1890  if (ioc->diag_buffer_status[buffer_type] &
1891  MPT2_DIAG_BUFFER_IS_RELEASED) {
1892  printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) "
1893  "is already released\n", ioc->name, __func__,
1894  buffer_type);
1895  return 0;
1896  }
1897 
1898  request_data = ioc->diag_buffer[buffer_type];
1899 
1900  if (!request_data) {
1901  printk(MPT2SAS_ERR_FMT "%s: doesn't have memory allocated for "
1902  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1903  return -ENOMEM;
1904  }
1905 
1906  /* buffers were released by due to host reset */
1907  if ((ioc->diag_buffer_status[buffer_type] &
1912  ~MPT2_DIAG_BUFFER_IS_DIAG_RESET;
1913  printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) "
1914  "was released due to host reset\n", ioc->name, __func__,
1915  buffer_type);
1916  return 0;
1917  }
1918 
1919  rc = _ctl_send_release(ioc, buffer_type, &issue_reset);
1920 
1921  if (issue_reset)
1924 
1925  return rc;
1926 }
1927 
1933 static long
1934 _ctl_diag_read_buffer(struct MPT2SAS_ADAPTER *ioc, void __user *arg)
1935 {
1936  struct mpt2_diag_read_buffer karg;
1937  struct mpt2_diag_read_buffer __user *uarg = arg;
1938  void *request_data, *diag_data;
1939  Mpi2DiagBufferPostRequest_t *mpi_request;
1940  Mpi2DiagBufferPostReply_t *mpi_reply;
1941  int rc, i;
1942  u8 buffer_type;
1943  unsigned long timeleft, request_size, copy_size;
1944  u16 smid;
1945  u16 ioc_status;
1946  u8 issue_reset = 0;
1947 
1948  if (copy_from_user(&karg, arg, sizeof(karg))) {
1949  printk(KERN_ERR "failure at %s:%d/%s()!\n",
1950  __FILE__, __LINE__, __func__);
1951  return -EFAULT;
1952  }
1953 
1954  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
1955  __func__));
1956 
1957  buffer_type = karg.unique_id & 0x000000ff;
1958  if (!_ctl_diag_capability(ioc, buffer_type)) {
1959  printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for "
1960  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1961  return -EPERM;
1962  }
1963 
1964  if (karg.unique_id != ioc->unique_id[buffer_type]) {
1965  printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not "
1966  "registered\n", ioc->name, __func__, karg.unique_id);
1967  return -EINVAL;
1968  }
1969 
1970  request_data = ioc->diag_buffer[buffer_type];
1971  if (!request_data) {
1972  printk(MPT2SAS_ERR_FMT "%s: doesn't have buffer for "
1973  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type);
1974  return -ENOMEM;
1975  }
1976 
1977  request_size = ioc->diag_buffer_sz[buffer_type];
1978 
1979  if ((karg.starting_offset % 4) || (karg.bytes_to_read % 4)) {
1980  printk(MPT2SAS_ERR_FMT "%s: either the starting_offset "
1981  "or bytes_to_read are not 4 byte aligned\n", ioc->name,
1982  __func__);
1983  return -EINVAL;
1984  }
1985 
1986  if (karg.starting_offset > request_size)
1987  return -EINVAL;
1988 
1989  diag_data = (void *)(request_data + karg.starting_offset);
1990  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: diag_buffer(%p), "
1991  "offset(%d), sz(%d)\n", ioc->name, __func__,
1992  diag_data, karg.starting_offset, karg.bytes_to_read));
1993 
1994  /* Truncate data on requests that are too large */
1995  if ((diag_data + karg.bytes_to_read < diag_data) ||
1996  (diag_data + karg.bytes_to_read > request_data + request_size))
1997  copy_size = request_size - karg.starting_offset;
1998  else
1999  copy_size = karg.bytes_to_read;
2000 
2001  if (copy_to_user((void __user *)uarg->diagnostic_data,
2002  diag_data, copy_size)) {
2003  printk(MPT2SAS_ERR_FMT "%s: Unable to write "
2004  "mpt_diag_read_buffer_t data @ %p\n", ioc->name,
2005  __func__, diag_data);
2006  return -EFAULT;
2007  }
2008 
2009  if ((karg.flags & MPT2_FLAGS_REREGISTER) == 0)
2010  return 0;
2011 
2012  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: Reregister "
2013  "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type));
2014  if ((ioc->diag_buffer_status[buffer_type] &
2015  MPT2_DIAG_BUFFER_IS_RELEASED) == 0) {
2016  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
2017  "buffer_type(0x%02x) is still registered\n", ioc->name,
2018  __func__, buffer_type));
2019  return 0;
2020  }
2021  /* Get a free request frame and save the message context.
2022  */
2023 
2024  if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
2025  printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
2026  ioc->name, __func__);
2027  rc = -EAGAIN;
2028  goto out;
2029  }
2030 
2031  smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx);
2032  if (!smid) {
2033  printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
2034  ioc->name, __func__);
2035  rc = -EAGAIN;
2036  goto out;
2037  }
2038 
2039  rc = 0;
2040  ioc->ctl_cmds.status = MPT2_CMD_PENDING;
2041  memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
2042  mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
2043  ioc->ctl_cmds.smid = smid;
2044 
2046  mpi_request->BufferType = buffer_type;
2047  mpi_request->BufferLength =
2048  cpu_to_le32(ioc->diag_buffer_sz[buffer_type]);
2049  mpi_request->BufferAddress =
2050  cpu_to_le64(ioc->diag_buffer_dma[buffer_type]);
2051  for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++)
2052  mpi_request->ProductSpecific[i] =
2053  cpu_to_le32(ioc->product_specific[buffer_type][i]);
2054  mpi_request->VF_ID = 0; /* TODO */
2055  mpi_request->VP_ID = 0;
2056 
2057  init_completion(&ioc->ctl_cmds.done);
2058  mpt2sas_base_put_smid_default(ioc, smid);
2059  timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
2061 
2062  if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) {
2063  printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name,
2064  __func__);
2065  _debug_dump_mf(mpi_request,
2066  sizeof(Mpi2DiagBufferPostRequest_t)/4);
2067  if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
2068  issue_reset = 1;
2069  goto issue_host_reset;
2070  }
2071 
2072  /* process the completed Reply Message Frame */
2073  if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) {
2074  printk(MPT2SAS_ERR_FMT "%s: no reply message\n",
2075  ioc->name, __func__);
2076  rc = -EFAULT;
2077  goto out;
2078  }
2079 
2080  mpi_reply = ioc->ctl_cmds.reply;
2081  ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK;
2082 
2083  if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
2086  dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: success\n",
2087  ioc->name, __func__));
2088  } else {
2089  printk(MPT2SAS_INFO_FMT "%s: ioc_status(0x%04x) "
2090  "log_info(0x%08x)\n", ioc->name, __func__,
2091  ioc_status, le32_to_cpu(mpi_reply->IOCLogInfo));
2092  rc = -EFAULT;
2093  }
2094 
2095  issue_host_reset:
2096  if (issue_reset)
2099 
2100  out:
2101 
2102  ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
2103  return rc;
2104 }
2105 
2106 
2107 #ifdef CONFIG_COMPAT
2108 
2116 static long
2117 _ctl_compat_mpt_command(struct MPT2SAS_ADAPTER *ioc, unsigned cmd,
2118  void __user *arg)
2119 {
2120  struct mpt2_ioctl_command32 karg32;
2121  struct mpt2_ioctl_command32 __user *uarg;
2122  struct mpt2_ioctl_command karg;
2123 
2124  if (_IOC_SIZE(cmd) != sizeof(struct mpt2_ioctl_command32))
2125  return -EINVAL;
2126 
2127  uarg = (struct mpt2_ioctl_command32 __user *) arg;
2128 
2129  if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32))) {
2130  printk(KERN_ERR "failure at %s:%d/%s()!\n",
2131  __FILE__, __LINE__, __func__);
2132  return -EFAULT;
2133  }
2134 
2135  memset(&karg, 0, sizeof(struct mpt2_ioctl_command));
2136  karg.hdr.ioc_number = karg32.hdr.ioc_number;
2137  karg.hdr.port_number = karg32.hdr.port_number;
2138  karg.hdr.max_data_size = karg32.hdr.max_data_size;
2139  karg.timeout = karg32.timeout;
2140  karg.max_reply_bytes = karg32.max_reply_bytes;
2141  karg.data_in_size = karg32.data_in_size;
2142  karg.data_out_size = karg32.data_out_size;
2143  karg.max_sense_bytes = karg32.max_sense_bytes;
2144  karg.data_sge_offset = karg32.data_sge_offset;
2145  karg.reply_frame_buf_ptr = compat_ptr(karg32.reply_frame_buf_ptr);
2146  karg.data_in_buf_ptr = compat_ptr(karg32.data_in_buf_ptr);
2147  karg.data_out_buf_ptr = compat_ptr(karg32.data_out_buf_ptr);
2148  karg.sense_data_ptr = compat_ptr(karg32.sense_data_ptr);
2149  return _ctl_do_mpt_command(ioc, karg, &uarg->mf);
2150 }
2151 #endif
2152 
2160 static long
2161 _ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg,
2162  u8 compat)
2163 {
2164  struct MPT2SAS_ADAPTER *ioc;
2166  enum block_state state;
2167  long ret = -EINVAL;
2168 
2169  /* get IOCTL header */
2170  if (copy_from_user(&ioctl_header, (char __user *)arg,
2171  sizeof(struct mpt2_ioctl_header))) {
2172  printk(KERN_ERR "failure at %s:%d/%s()!\n",
2173  __FILE__, __LINE__, __func__);
2174  return -EFAULT;
2175  }
2176 
2177  if (_ctl_verify_adapter(ioctl_header.ioc_number, &ioc) == -1 || !ioc)
2178  return -ENODEV;
2179  if (ioc->shost_recovery || ioc->pci_error_recovery ||
2180  ioc->is_driver_loading)
2181  return -EAGAIN;
2182 
2183  state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING;
2184  if (state == NON_BLOCKING) {
2185  if (!mutex_trylock(&ioc->ctl_cmds.mutex))
2186  return -EAGAIN;
2187  } else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) {
2188  return -ERESTARTSYS;
2189  }
2190 
2191  switch (cmd) {
2192  case MPT2IOCINFO:
2193  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_iocinfo))
2194  ret = _ctl_getiocinfo(ioc, arg);
2195  break;
2196 #ifdef CONFIG_COMPAT
2197  case MPT2COMMAND32:
2198 #endif
2199  case MPT2COMMAND:
2200  {
2201  struct mpt2_ioctl_command __user *uarg;
2202  struct mpt2_ioctl_command karg;
2203 #ifdef CONFIG_COMPAT
2204  if (compat) {
2205  ret = _ctl_compat_mpt_command(ioc, cmd, arg);
2206  break;
2207  }
2208 #endif
2209  if (copy_from_user(&karg, arg, sizeof(karg))) {
2210  printk(KERN_ERR "failure at %s:%d/%s()!\n",
2211  __FILE__, __LINE__, __func__);
2212  ret = -EFAULT;
2213  break;
2214  }
2215 
2216  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_command)) {
2217  uarg = arg;
2218  ret = _ctl_do_mpt_command(ioc, karg, &uarg->mf);
2219  }
2220  break;
2221  }
2222  case MPT2EVENTQUERY:
2223  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_eventquery))
2224  ret = _ctl_eventquery(ioc, arg);
2225  break;
2226  case MPT2EVENTENABLE:
2227  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_eventenable))
2228  ret = _ctl_eventenable(ioc, arg);
2229  break;
2230  case MPT2EVENTREPORT:
2231  ret = _ctl_eventreport(ioc, arg);
2232  break;
2233  case MPT2HARDRESET:
2234  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_diag_reset))
2235  ret = _ctl_do_reset(ioc, arg);
2236  break;
2237  case MPT2BTDHMAPPING:
2238  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_btdh_mapping))
2239  ret = _ctl_btdh_mapping(ioc, arg);
2240  break;
2241  case MPT2DIAGREGISTER:
2242  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_register))
2243  ret = _ctl_diag_register(ioc, arg);
2244  break;
2245  case MPT2DIAGUNREGISTER:
2246  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_unregister))
2247  ret = _ctl_diag_unregister(ioc, arg);
2248  break;
2249  case MPT2DIAGQUERY:
2250  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_query))
2251  ret = _ctl_diag_query(ioc, arg);
2252  break;
2253  case MPT2DIAGRELEASE:
2254  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_release))
2255  ret = _ctl_diag_release(ioc, arg);
2256  break;
2257  case MPT2DIAGREADBUFFER:
2258  if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_read_buffer))
2259  ret = _ctl_diag_read_buffer(ioc, arg);
2260  break;
2261  default:
2262 
2264  "unsupported ioctl opcode(0x%08x)\n", ioc->name, cmd));
2265  break;
2266  }
2267 
2268  mutex_unlock(&ioc->ctl_cmds.mutex);
2269  return ret;
2270 }
2271 
2278 static long
2279 _ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
2280 {
2281  long ret;
2282 
2283  ret = _ctl_ioctl_main(file, cmd, (void __user *)arg, 0);
2284  return ret;
2285 }
2286 #ifdef CONFIG_COMPAT
2287 
2295 static long
2296 _ctl_ioctl_compat(struct file *file, unsigned cmd, unsigned long arg)
2297 {
2298  long ret;
2299 
2300  ret = _ctl_ioctl_main(file, cmd, (void __user *)arg, 1);
2301  return ret;
2302 }
2303 #endif
2304 
2305 /* scsi host attributes */
2306 
2314 static ssize_t
2315 _ctl_version_fw_show(struct device *cdev, struct device_attribute *attr,
2316  char *buf)
2317 {
2318  struct Scsi_Host *shost = class_to_shost(cdev);
2319  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2320 
2321  return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n",
2322  (ioc->facts.FWVersion.Word & 0xFF000000) >> 24,
2323  (ioc->facts.FWVersion.Word & 0x00FF0000) >> 16,
2324  (ioc->facts.FWVersion.Word & 0x0000FF00) >> 8,
2325  ioc->facts.FWVersion.Word & 0x000000FF);
2326 }
2327 static DEVICE_ATTR(version_fw, S_IRUGO, _ctl_version_fw_show, NULL);
2328 
2336 static ssize_t
2337 _ctl_version_bios_show(struct device *cdev, struct device_attribute *attr,
2338  char *buf)
2339 {
2340  struct Scsi_Host *shost = class_to_shost(cdev);
2341  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2342 
2344 
2345  return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n",
2346  (version & 0xFF000000) >> 24,
2347  (version & 0x00FF0000) >> 16,
2348  (version & 0x0000FF00) >> 8,
2349  version & 0x000000FF);
2350 }
2351 static DEVICE_ATTR(version_bios, S_IRUGO, _ctl_version_bios_show, NULL);
2352 
2360 static ssize_t
2361 _ctl_version_mpi_show(struct device *cdev, struct device_attribute *attr,
2362  char *buf)
2363 {
2364  struct Scsi_Host *shost = class_to_shost(cdev);
2365  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2366 
2367  return snprintf(buf, PAGE_SIZE, "%03x.%02x\n",
2368  ioc->facts.MsgVersion, ioc->facts.HeaderVersion >> 8);
2369 }
2370 static DEVICE_ATTR(version_mpi, S_IRUGO, _ctl_version_mpi_show, NULL);
2371 
2379 static ssize_t
2380 _ctl_version_product_show(struct device *cdev, struct device_attribute *attr,
2381  char *buf)
2382 {
2383  struct Scsi_Host *shost = class_to_shost(cdev);
2384  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2385 
2386  return snprintf(buf, 16, "%s\n", ioc->manu_pg0.ChipName);
2387 }
2388 static DEVICE_ATTR(version_product, S_IRUGO,
2389  _ctl_version_product_show, NULL);
2390 
2398 static ssize_t
2399 _ctl_version_nvdata_persistent_show(struct device *cdev,
2400  struct device_attribute *attr, char *buf)
2401 {
2402  struct Scsi_Host *shost = class_to_shost(cdev);
2403  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2404 
2405  return snprintf(buf, PAGE_SIZE, "%08xh\n",
2407 }
2408 static DEVICE_ATTR(version_nvdata_persistent, S_IRUGO,
2409  _ctl_version_nvdata_persistent_show, NULL);
2410 
2418 static ssize_t
2419 _ctl_version_nvdata_default_show(struct device *cdev,
2420  struct device_attribute *attr, char *buf)
2421 {
2422  struct Scsi_Host *shost = class_to_shost(cdev);
2423  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2424 
2425  return snprintf(buf, PAGE_SIZE, "%08xh\n",
2427 }
2428 static DEVICE_ATTR(version_nvdata_default, S_IRUGO,
2429  _ctl_version_nvdata_default_show, NULL);
2430 
2438 static ssize_t
2439 _ctl_board_name_show(struct device *cdev, struct device_attribute *attr,
2440  char *buf)
2441 {
2442  struct Scsi_Host *shost = class_to_shost(cdev);
2443  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2444 
2445  return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardName);
2446 }
2447 static DEVICE_ATTR(board_name, S_IRUGO, _ctl_board_name_show, NULL);
2448 
2456 static ssize_t
2457 _ctl_board_assembly_show(struct device *cdev, struct device_attribute *attr,
2458  char *buf)
2459 {
2460  struct Scsi_Host *shost = class_to_shost(cdev);
2461  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2462 
2463  return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardAssembly);
2464 }
2465 static DEVICE_ATTR(board_assembly, S_IRUGO,
2466  _ctl_board_assembly_show, NULL);
2467 
2475 static ssize_t
2476 _ctl_board_tracer_show(struct device *cdev, struct device_attribute *attr,
2477  char *buf)
2478 {
2479  struct Scsi_Host *shost = class_to_shost(cdev);
2480  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2481 
2482  return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardTracerNumber);
2483 }
2484 static DEVICE_ATTR(board_tracer, S_IRUGO,
2485  _ctl_board_tracer_show, NULL);
2486 
2497 static ssize_t
2498 _ctl_io_delay_show(struct device *cdev, struct device_attribute *attr,
2499  char *buf)
2500 {
2501  struct Scsi_Host *shost = class_to_shost(cdev);
2502  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2503 
2504  return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->io_missing_delay);
2505 }
2506 static DEVICE_ATTR(io_delay, S_IRUGO,
2507  _ctl_io_delay_show, NULL);
2508 
2519 static ssize_t
2520 _ctl_device_delay_show(struct device *cdev, struct device_attribute *attr,
2521  char *buf)
2522 {
2523  struct Scsi_Host *shost = class_to_shost(cdev);
2524  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2525 
2526  return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->device_missing_delay);
2527 }
2528 static DEVICE_ATTR(device_delay, S_IRUGO,
2529  _ctl_device_delay_show, NULL);
2530 
2540 static ssize_t
2541 _ctl_fw_queue_depth_show(struct device *cdev, struct device_attribute *attr,
2542  char *buf)
2543 {
2544  struct Scsi_Host *shost = class_to_shost(cdev);
2545  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2546 
2547  return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->facts.RequestCredit);
2548 }
2549 static DEVICE_ATTR(fw_queue_depth, S_IRUGO,
2550  _ctl_fw_queue_depth_show, NULL);
2551 
2561 static ssize_t
2562 _ctl_host_sas_address_show(struct device *cdev, struct device_attribute *attr,
2563  char *buf)
2564 {
2565  struct Scsi_Host *shost = class_to_shost(cdev);
2566  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2567 
2568  return snprintf(buf, PAGE_SIZE, "0x%016llx\n",
2569  (unsigned long long)ioc->sas_hba.sas_address);
2570 }
2571 static DEVICE_ATTR(host_sas_address, S_IRUGO,
2572  _ctl_host_sas_address_show, NULL);
2573 
2581 static ssize_t
2582 _ctl_logging_level_show(struct device *cdev, struct device_attribute *attr,
2583  char *buf)
2584 {
2585  struct Scsi_Host *shost = class_to_shost(cdev);
2586  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2587 
2588  return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->logging_level);
2589 }
2590 static ssize_t
2591 _ctl_logging_level_store(struct device *cdev, struct device_attribute *attr,
2592  const char *buf, size_t count)
2593 {
2594  struct Scsi_Host *shost = class_to_shost(cdev);
2595  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2596  int val = 0;
2597 
2598  if (sscanf(buf, "%x", &val) != 1)
2599  return -EINVAL;
2600 
2601  ioc->logging_level = val;
2602  printk(MPT2SAS_INFO_FMT "logging_level=%08xh\n", ioc->name,
2603  ioc->logging_level);
2604  return strlen(buf);
2605 }
2607  _ctl_logging_level_show, _ctl_logging_level_store);
2608 
2609 /* device attributes */
2610 /*
2611  * _ctl_fwfault_debug_show - show/store fwfault_debug
2612  * @cdev - pointer to embedded class device
2613  * @buf - the buffer returned
2614  *
2615  * mpt2sas_fwfault_debug is command line option
2616  * A sysfs 'read/write' shost attribute.
2617  */
2618 static ssize_t
2619 _ctl_fwfault_debug_show(struct device *cdev,
2620  struct device_attribute *attr, char *buf)
2621 {
2622  struct Scsi_Host *shost = class_to_shost(cdev);
2623  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2624 
2625  return snprintf(buf, PAGE_SIZE, "%d\n", ioc->fwfault_debug);
2626 }
2627 static ssize_t
2628 _ctl_fwfault_debug_store(struct device *cdev,
2629  struct device_attribute *attr, const char *buf, size_t count)
2630 {
2631  struct Scsi_Host *shost = class_to_shost(cdev);
2632  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2633  int val = 0;
2634 
2635  if (sscanf(buf, "%d", &val) != 1)
2636  return -EINVAL;
2637 
2638  ioc->fwfault_debug = val;
2639  printk(MPT2SAS_INFO_FMT "fwfault_debug=%d\n", ioc->name,
2640  ioc->fwfault_debug);
2641  return strlen(buf);
2642 }
2644  _ctl_fwfault_debug_show, _ctl_fwfault_debug_store);
2645 
2646 
2656 static ssize_t
2657 _ctl_ioc_reset_count_show(struct device *cdev, struct device_attribute *attr,
2658  char *buf)
2659 {
2660  struct Scsi_Host *shost = class_to_shost(cdev);
2661  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2662 
2663  return snprintf(buf, PAGE_SIZE, "%08d\n", ioc->ioc_reset_count);
2664 }
2666  _ctl_ioc_reset_count_show, NULL);
2667 
2677 static ssize_t
2678 _ctl_ioc_reply_queue_count_show(struct device *cdev,
2679  struct device_attribute *attr, char *buf)
2680 {
2682  struct Scsi_Host *shost = class_to_shost(cdev);
2683  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2684 
2685  if ((ioc->facts.IOCCapabilities &
2687  reply_queue_count = ioc->reply_queue_count;
2688  else
2689  reply_queue_count = 1;
2690  return snprintf(buf, PAGE_SIZE, "%d\n", reply_queue_count);
2691 }
2692 static DEVICE_ATTR(reply_queue_count, S_IRUGO,
2693  _ctl_ioc_reply_queue_count_show, NULL);
2694 
2704 static ssize_t
2705 _ctl_BRM_status_show(struct device *cdev, struct device_attribute *attr,
2706  char *buf)
2707 {
2708  struct Scsi_Host *shost = class_to_shost(cdev);
2709  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2710  Mpi2IOUnitPage3_t *io_unit_pg3 = NULL;
2711  Mpi2ConfigReply_t mpi_reply;
2712  u16 backup_rail_monitor_status = 0;
2713  u16 ioc_status;
2714  int sz;
2715  ssize_t rc = 0;
2716 
2717  if (!ioc->is_warpdrive) {
2718  printk(MPT2SAS_ERR_FMT "%s: BRM attribute is only for"\
2719  "warpdrive\n", ioc->name, __func__);
2720  goto out;
2721  }
2722 
2723  /* allocate upto GPIOVal 36 entries */
2724  sz = offsetof(Mpi2IOUnitPage3_t, GPIOVal) + (sizeof(u16) * 36);
2725  io_unit_pg3 = kzalloc(sz, GFP_KERNEL);
2726  if (!io_unit_pg3) {
2727  printk(MPT2SAS_ERR_FMT "%s: failed allocating memory"\
2728  "for iounit_pg3: (%d) bytes\n", ioc->name, __func__, sz);
2729  goto out;
2730  }
2731 
2732  if (mpt2sas_config_get_iounit_pg3(ioc, &mpi_reply, io_unit_pg3, sz) !=
2733  0) {
2735  "%s: failed reading iounit_pg3\n", ioc->name,
2736  __func__);
2737  goto out;
2738  }
2739 
2740  ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
2741  if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
2742  printk(MPT2SAS_ERR_FMT "%s: iounit_pg3 failed with"\
2743  "ioc_status(0x%04x)\n", ioc->name, __func__, ioc_status);
2744  goto out;
2745  }
2746 
2747  if (io_unit_pg3->GPIOCount < 25) {
2748  printk(MPT2SAS_ERR_FMT "%s: iounit_pg3->GPIOCount less than"\
2749  "25 entries, detected (%d) entries\n", ioc->name, __func__,
2750  io_unit_pg3->GPIOCount);
2751  goto out;
2752  }
2753 
2754  /* BRM status is in bit zero of GPIOVal[24] */
2755  backup_rail_monitor_status = le16_to_cpu(io_unit_pg3->GPIOVal[24]);
2756  rc = snprintf(buf, PAGE_SIZE, "%d\n", (backup_rail_monitor_status & 1));
2757 
2758  out:
2759  kfree(io_unit_pg3);
2760  return rc;
2761 }
2762 static DEVICE_ATTR(BRM_status, S_IRUGO, _ctl_BRM_status_show, NULL);
2763 
2772 };
2780 static ssize_t
2781 _ctl_host_trace_buffer_size_show(struct device *cdev,
2782  struct device_attribute *attr, char *buf)
2783 {
2784  struct Scsi_Host *shost = class_to_shost(cdev);
2785  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2786  u32 size = 0;
2787  struct DIAG_BUFFER_START *request_data;
2788 
2790  printk(MPT2SAS_ERR_FMT "%s: host_trace_buffer is not "
2791  "registered\n", ioc->name, __func__);
2792  return 0;
2793  }
2794 
2796  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
2797  printk(MPT2SAS_ERR_FMT "%s: host_trace_buffer is not "
2798  "registered\n", ioc->name, __func__);
2799  return 0;
2800  }
2801 
2802  request_data = (struct DIAG_BUFFER_START *)
2804  if ((le32_to_cpu(request_data->DiagVersion) == 0x00000000 ||
2805  le32_to_cpu(request_data->DiagVersion) == 0x01000000) &&
2806  le32_to_cpu(request_data->Reserved3) == 0x4742444c)
2807  size = le32_to_cpu(request_data->Size);
2808 
2809  ioc->ring_buffer_sz = size;
2810  return snprintf(buf, PAGE_SIZE, "%d\n", size);
2811 }
2812 static DEVICE_ATTR(host_trace_buffer_size, S_IRUGO,
2813  _ctl_host_trace_buffer_size_show, NULL);
2814 
2826 static ssize_t
2827 _ctl_host_trace_buffer_show(struct device *cdev, struct device_attribute *attr,
2828  char *buf)
2829 {
2830  struct Scsi_Host *shost = class_to_shost(cdev);
2831  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2832  void *request_data;
2833  u32 size;
2834 
2836  printk(MPT2SAS_ERR_FMT "%s: host_trace_buffer is not "
2837  "registered\n", ioc->name, __func__);
2838  return 0;
2839  }
2840 
2842  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) {
2843  printk(MPT2SAS_ERR_FMT "%s: host_trace_buffer is not "
2844  "registered\n", ioc->name, __func__);
2845  return 0;
2846  }
2847 
2848  if (ioc->ring_buffer_offset > ioc->ring_buffer_sz)
2849  return 0;
2850 
2851  size = ioc->ring_buffer_sz - ioc->ring_buffer_offset;
2852  size = (size > PAGE_SIZE) ? PAGE_SIZE : size;
2853  request_data = ioc->diag_buffer[0] + ioc->ring_buffer_offset;
2854  memcpy(buf, request_data, size);
2855  return size;
2856 }
2857 
2858 static ssize_t
2859 _ctl_host_trace_buffer_store(struct device *cdev, struct device_attribute *attr,
2860  const char *buf, size_t count)
2861 {
2862  struct Scsi_Host *shost = class_to_shost(cdev);
2863  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2864  int val = 0;
2865 
2866  if (sscanf(buf, "%d", &val) != 1)
2867  return -EINVAL;
2868 
2869  ioc->ring_buffer_offset = val;
2870  return strlen(buf);
2871 }
2872 static DEVICE_ATTR(host_trace_buffer, S_IRUGO | S_IWUSR,
2873  _ctl_host_trace_buffer_show, _ctl_host_trace_buffer_store);
2874 
2875 /*****************************************/
2876 
2886 static ssize_t
2887 _ctl_host_trace_buffer_enable_show(struct device *cdev,
2888  struct device_attribute *attr, char *buf)
2889 {
2890  struct Scsi_Host *shost = class_to_shost(cdev);
2891  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2892 
2893  if ((!ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) ||
2895  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0))
2896  return snprintf(buf, PAGE_SIZE, "off\n");
2898  MPT2_DIAG_BUFFER_IS_RELEASED))
2899  return snprintf(buf, PAGE_SIZE, "release\n");
2900  else
2901  return snprintf(buf, PAGE_SIZE, "post\n");
2902 }
2903 
2904 static ssize_t
2905 _ctl_host_trace_buffer_enable_store(struct device *cdev,
2906  struct device_attribute *attr, const char *buf, size_t count)
2907 {
2908  struct Scsi_Host *shost = class_to_shost(cdev);
2909  struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
2910  char str[10] = "";
2911  struct mpt2_diag_register diag_register;
2912  u8 issue_reset = 0;
2913 
2914  if (sscanf(buf, "%9s", str) != 1)
2915  return -EINVAL;
2916 
2917  if (!strcmp(str, "post")) {
2918  /* exit out if host buffers are already posted */
2919  if ((ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) &&
2921  MPT2_DIAG_BUFFER_IS_REGISTERED) &&
2923  MPT2_DIAG_BUFFER_IS_RELEASED) == 0))
2924  goto out;
2925  memset(&diag_register, 0, sizeof(struct mpt2_diag_register));
2926  printk(MPT2SAS_INFO_FMT "posting host trace buffers\n",
2927  ioc->name);
2928  diag_register.buffer_type = MPI2_DIAG_BUF_TYPE_TRACE;
2929  diag_register.requested_buffer_size = (1024 * 1024);
2930  diag_register.unique_id = 0x7075900;
2932  _ctl_diag_register_2(ioc, &diag_register);
2933  } else if (!strcmp(str, "release")) {
2934  /* exit out if host buffers are already released */
2936  goto out;
2938  MPT2_DIAG_BUFFER_IS_REGISTERED) == 0)
2939  goto out;
2941  MPT2_DIAG_BUFFER_IS_RELEASED))
2942  goto out;
2943  printk(MPT2SAS_INFO_FMT "releasing host trace buffer\n",
2944  ioc->name);
2945  _ctl_send_release(ioc, MPI2_DIAG_BUF_TYPE_TRACE, &issue_reset);
2946  }
2947 
2948  out:
2949  return strlen(buf);
2950 }
2951 static DEVICE_ATTR(host_trace_buffer_enable, S_IRUGO | S_IWUSR,
2952  _ctl_host_trace_buffer_enable_show, _ctl_host_trace_buffer_enable_store);
2953 
2955  &dev_attr_version_fw,
2956  &dev_attr_version_bios,
2957  &dev_attr_version_mpi,
2958  &dev_attr_version_product,
2959  &dev_attr_version_nvdata_persistent,
2960  &dev_attr_version_nvdata_default,
2961  &dev_attr_board_name,
2962  &dev_attr_board_assembly,
2963  &dev_attr_board_tracer,
2964  &dev_attr_io_delay,
2965  &dev_attr_device_delay,
2966  &dev_attr_logging_level,
2967  &dev_attr_fwfault_debug,
2968  &dev_attr_fw_queue_depth,
2969  &dev_attr_host_sas_address,
2970  &dev_attr_ioc_reset_count,
2971  &dev_attr_host_trace_buffer_size,
2972  &dev_attr_host_trace_buffer,
2973  &dev_attr_host_trace_buffer_enable,
2974  &dev_attr_reply_queue_count,
2975  &dev_attr_BRM_status,
2976  NULL,
2977 };
2978 
2988 static ssize_t
2989 _ctl_device_sas_address_show(struct device *dev, struct device_attribute *attr,
2990  char *buf)
2991 {
2992  struct scsi_device *sdev = to_scsi_device(dev);
2993  struct MPT2SAS_DEVICE *sas_device_priv_data = sdev->hostdata;
2994 
2995  return snprintf(buf, PAGE_SIZE, "0x%016llx\n",
2996  (unsigned long long)sas_device_priv_data->sas_target->sas_address);
2997 }
2998 static DEVICE_ATTR(sas_address, S_IRUGO, _ctl_device_sas_address_show, NULL);
2999 
3009 static ssize_t
3010 _ctl_device_handle_show(struct device *dev, struct device_attribute *attr,
3011  char *buf)
3012 {
3013  struct scsi_device *sdev = to_scsi_device(dev);
3014  struct MPT2SAS_DEVICE *sas_device_priv_data = sdev->hostdata;
3015 
3016  return snprintf(buf, PAGE_SIZE, "0x%04x\n",
3017  sas_device_priv_data->sas_target->handle);
3018 }
3019 static DEVICE_ATTR(sas_device_handle, S_IRUGO, _ctl_device_handle_show, NULL);
3020 
3022  &dev_attr_sas_address,
3023  &dev_attr_sas_device_handle,
3024  NULL,
3025 };
3026 
3027 static const struct file_operations ctl_fops = {
3028  .owner = THIS_MODULE,
3029  .unlocked_ioctl = _ctl_ioctl,
3030  .release = _ctl_release,
3031  .poll = _ctl_poll,
3032  .fasync = _ctl_fasync,
3033 #ifdef CONFIG_COMPAT
3034  .compat_ioctl = _ctl_ioctl_compat,
3035 #endif
3036  .llseek = noop_llseek,
3037 };
3038 
3039 static struct miscdevice ctl_dev = {
3040  .minor = MPT2SAS_MINOR,
3041  .name = MPT2SAS_DEV_NAME,
3042  .fops = &ctl_fops,
3043 };
3044 
3049 void
3051 {
3052  async_queue = NULL;
3053  if (misc_register(&ctl_dev) < 0)
3054  printk(KERN_ERR "%s can't register misc device [minor=%d]\n",
3056 
3057  init_waitqueue_head(&ctl_poll_wait);
3058 }
3059 
3064 void
3066 {
3067  struct MPT2SAS_ADAPTER *ioc;
3068  int i;
3069 
3071 
3072  /* free memory associated to diag buffers */
3073  for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
3074  if (!ioc->diag_buffer[i])
3075  continue;
3076  pci_free_consistent(ioc->pdev, ioc->diag_buffer_sz[i],
3077  ioc->diag_buffer[i], ioc->diag_buffer_dma[i]);
3078  ioc->diag_buffer[i] = NULL;
3079  ioc->diag_buffer_status[i] = 0;
3080  }
3081 
3082  kfree(ioc->event_log);
3083  }
3084  misc_deregister(&ctl_dev);
3085 }
3086