GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / scsi / esas2r / esas2r_ioctl.c
1 /*
2  *  linux/drivers/scsi/esas2r/esas2r_ioctl.c
3  *      For use with ATTO ExpressSAS R6xx SAS/SATA RAID controllers
4  *
5  *  Copyright (c) 2001-2013 ATTO Technology, Inc.
6  *  (mailto:linuxdrivers@attotech.com)
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * NO WARRANTY
19  * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
20  * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
21  * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
22  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
23  * solely responsible for determining the appropriateness of using and
24  * distributing the Program and assumes all risks associated with its
25  * exercise of rights under this Agreement, including but not limited to
26  * the risks and costs of program errors, damage to or loss of data,
27  * programs or equipment, and unavailability or interruption of operations.
28  *
29  * DISCLAIMER OF LIABILITY
30  * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
31  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
33  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35  * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
36  * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
37  *
38  * You should have received a copy of the GNU General Public License
39  * along with this program; if not, write to the Free Software
40  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
41  * USA.
42  */
43
44 #include <linux/bitfield.h>
45
46 #include "esas2r.h"
47
48 /*
49  * Buffered ioctl handlers.  A buffered ioctl is one which requires that we
50  * allocate a DMA-able memory area to communicate with the firmware.  In
51  * order to prevent continually allocating and freeing consistent memory,
52  * we will allocate a global buffer the first time we need it and re-use
53  * it for subsequent ioctl calls that require it.
54  */
55
56 u8 *esas2r_buffered_ioctl;
57 dma_addr_t esas2r_buffered_ioctl_addr;
58 u32 esas2r_buffered_ioctl_size;
59 struct pci_dev *esas2r_buffered_ioctl_pcid;
60
61 static DEFINE_SEMAPHORE(buffered_ioctl_semaphore, 1);
62 typedef int (*BUFFERED_IOCTL_CALLBACK)(struct esas2r_adapter *,
63                                        struct esas2r_request *,
64                                        struct esas2r_sg_context *,
65                                        void *);
66 typedef void (*BUFFERED_IOCTL_DONE_CALLBACK)(struct esas2r_adapter *,
67                                              struct esas2r_request *, void *);
68
69 struct esas2r_buffered_ioctl {
70         struct esas2r_adapter *a;
71         void *ioctl;
72         u32 length;
73         u32 control_code;
74         u32 offset;
75         BUFFERED_IOCTL_CALLBACK
76                 callback;
77         void *context;
78         BUFFERED_IOCTL_DONE_CALLBACK
79                 done_callback;
80         void *done_context;
81
82 };
83
84 static void complete_fm_api_req(struct esas2r_adapter *a,
85                                 struct esas2r_request *rq)
86 {
87         a->fm_api_command_done = 1;
88         wake_up_interruptible(&a->fm_api_waiter);
89 }
90
91 /* Callbacks for building scatter/gather lists for FM API requests */
92 static u32 get_physaddr_fm_api(struct esas2r_sg_context *sgc, u64 *addr)
93 {
94         struct esas2r_adapter *a = (struct esas2r_adapter *)sgc->adapter;
95         int offset = sgc->cur_offset - a->save_offset;
96
97         (*addr) = a->firmware.phys + offset;
98         return a->firmware.orig_len - offset;
99 }
100
101 static u32 get_physaddr_fm_api_header(struct esas2r_sg_context *sgc, u64 *addr)
102 {
103         struct esas2r_adapter *a = (struct esas2r_adapter *)sgc->adapter;
104         int offset = sgc->cur_offset - a->save_offset;
105
106         (*addr) = a->firmware.header_buff_phys + offset;
107         return sizeof(struct esas2r_flash_img) - offset;
108 }
109
110 /* Handle EXPRESS_IOCTL_RW_FIRMWARE ioctl with img_type = FW_IMG_FM_API. */
111 static void do_fm_api(struct esas2r_adapter *a, struct esas2r_flash_img *fi)
112 {
113         struct esas2r_request *rq;
114
115         if (mutex_lock_interruptible(&a->fm_api_mutex)) {
116                 fi->status = FI_STAT_BUSY;
117                 return;
118         }
119
120         rq = esas2r_alloc_request(a);
121         if (rq == NULL) {
122                 fi->status = FI_STAT_BUSY;
123                 goto free_sem;
124         }
125
126         if (fi == &a->firmware.header) {
127                 a->firmware.header_buff = dma_alloc_coherent(&a->pcid->dev,
128                                                              (size_t)sizeof(
129                                                                      struct
130                                                                      esas2r_flash_img),
131                                                              (dma_addr_t *)&a->
132                                                              firmware.
133                                                              header_buff_phys,
134                                                              GFP_KERNEL);
135
136                 if (a->firmware.header_buff == NULL) {
137                         esas2r_debug("failed to allocate header buffer!");
138                         fi->status = FI_STAT_BUSY;
139                         goto free_req;
140                 }
141
142                 memcpy(a->firmware.header_buff, fi,
143                        sizeof(struct esas2r_flash_img));
144                 a->save_offset = a->firmware.header_buff;
145                 a->fm_api_sgc.get_phys_addr =
146                         (PGETPHYSADDR)get_physaddr_fm_api_header;
147         } else {
148                 a->save_offset = (u8 *)fi;
149                 a->fm_api_sgc.get_phys_addr =
150                         (PGETPHYSADDR)get_physaddr_fm_api;
151         }
152
153         rq->comp_cb = complete_fm_api_req;
154         a->fm_api_command_done = 0;
155         a->fm_api_sgc.cur_offset = a->save_offset;
156
157         if (!esas2r_fm_api(a, (struct esas2r_flash_img *)a->save_offset, rq,
158                            &a->fm_api_sgc))
159                 goto all_done;
160
161         /* Now wait around for it to complete. */
162         while (!a->fm_api_command_done)
163                 wait_event_interruptible(a->fm_api_waiter,
164                                          a->fm_api_command_done);
165 all_done:
166         if (fi == &a->firmware.header) {
167                 memcpy(fi, a->firmware.header_buff,
168                        sizeof(struct esas2r_flash_img));
169
170                 dma_free_coherent(&a->pcid->dev,
171                                   (size_t)sizeof(struct esas2r_flash_img),
172                                   a->firmware.header_buff,
173                                   (dma_addr_t)a->firmware.header_buff_phys);
174         }
175 free_req:
176         esas2r_free_request(a, (struct esas2r_request *)rq);
177 free_sem:
178         mutex_unlock(&a->fm_api_mutex);
179         return;
180
181 }
182
183 static void complete_nvr_req(struct esas2r_adapter *a,
184                              struct esas2r_request *rq)
185 {
186         a->nvram_command_done = 1;
187         wake_up_interruptible(&a->nvram_waiter);
188 }
189
190 /* Callback for building scatter/gather lists for buffered ioctls */
191 static u32 get_physaddr_buffered_ioctl(struct esas2r_sg_context *sgc,
192                                        u64 *addr)
193 {
194         int offset = (u8 *)sgc->cur_offset - esas2r_buffered_ioctl;
195
196         (*addr) = esas2r_buffered_ioctl_addr + offset;
197         return esas2r_buffered_ioctl_size - offset;
198 }
199
200 static void complete_buffered_ioctl_req(struct esas2r_adapter *a,
201                                         struct esas2r_request *rq)
202 {
203         a->buffered_ioctl_done = 1;
204         wake_up_interruptible(&a->buffered_ioctl_waiter);
205 }
206
207 static u8 handle_buffered_ioctl(struct esas2r_buffered_ioctl *bi)
208 {
209         struct esas2r_adapter *a = bi->a;
210         struct esas2r_request *rq;
211         struct esas2r_sg_context sgc;
212         u8 result = IOCTL_SUCCESS;
213
214         if (down_interruptible(&buffered_ioctl_semaphore))
215                 return IOCTL_OUT_OF_RESOURCES;
216
217         /* allocate a buffer or use the existing buffer. */
218         if (esas2r_buffered_ioctl) {
219                 if (esas2r_buffered_ioctl_size < bi->length) {
220                         /* free the too-small buffer and get a new one */
221                         dma_free_coherent(&a->pcid->dev,
222                                           (size_t)esas2r_buffered_ioctl_size,
223                                           esas2r_buffered_ioctl,
224                                           esas2r_buffered_ioctl_addr);
225
226                         goto allocate_buffer;
227                 }
228         } else {
229 allocate_buffer:
230                 esas2r_buffered_ioctl_size = bi->length;
231                 esas2r_buffered_ioctl_pcid = a->pcid;
232                 esas2r_buffered_ioctl = dma_alloc_coherent(&a->pcid->dev,
233                                                            (size_t)
234                                                            esas2r_buffered_ioctl_size,
235                                                            &
236                                                            esas2r_buffered_ioctl_addr,
237                                                            GFP_KERNEL);
238         }
239
240         if (!esas2r_buffered_ioctl) {
241                 esas2r_log(ESAS2R_LOG_CRIT,
242                            "could not allocate %d bytes of consistent memory "
243                            "for a buffered ioctl!",
244                            bi->length);
245
246                 esas2r_debug("buffered ioctl alloc failure");
247                 result = IOCTL_OUT_OF_RESOURCES;
248                 goto exit_cleanly;
249         }
250
251         memcpy(esas2r_buffered_ioctl, bi->ioctl, bi->length);
252
253         rq = esas2r_alloc_request(a);
254         if (rq == NULL) {
255                 esas2r_log(ESAS2R_LOG_CRIT,
256                            "could not allocate an internal request");
257
258                 result = IOCTL_OUT_OF_RESOURCES;
259                 esas2r_debug("buffered ioctl - no requests");
260                 goto exit_cleanly;
261         }
262
263         a->buffered_ioctl_done = 0;
264         rq->comp_cb = complete_buffered_ioctl_req;
265         sgc.cur_offset = esas2r_buffered_ioctl + bi->offset;
266         sgc.get_phys_addr = (PGETPHYSADDR)get_physaddr_buffered_ioctl;
267         sgc.length = esas2r_buffered_ioctl_size;
268
269         if (!(*bi->callback)(a, rq, &sgc, bi->context)) {
270                 /* completed immediately, no need to wait */
271                 a->buffered_ioctl_done = 0;
272                 goto free_andexit_cleanly;
273         }
274
275         /* now wait around for it to complete. */
276         while (!a->buffered_ioctl_done)
277                 wait_event_interruptible(a->buffered_ioctl_waiter,
278                                          a->buffered_ioctl_done);
279
280 free_andexit_cleanly:
281         if (result == IOCTL_SUCCESS && bi->done_callback)
282                 (*bi->done_callback)(a, rq, bi->done_context);
283
284         esas2r_free_request(a, rq);
285
286 exit_cleanly:
287         if (result == IOCTL_SUCCESS)
288                 memcpy(bi->ioctl, esas2r_buffered_ioctl, bi->length);
289
290         up(&buffered_ioctl_semaphore);
291         return result;
292 }
293
294 /* SMP ioctl support */
295 static int smp_ioctl_callback(struct esas2r_adapter *a,
296                               struct esas2r_request *rq,
297                               struct esas2r_sg_context *sgc, void *context)
298 {
299         struct atto_ioctl_smp *si =
300                 (struct atto_ioctl_smp *)esas2r_buffered_ioctl;
301
302         esas2r_sgc_init(sgc, a, rq, rq->vrq->ioctl.sge);
303         esas2r_build_ioctl_req(a, rq, sgc->length, VDA_IOCTL_SMP);
304
305         if (!esas2r_build_sg_list(a, rq, sgc)) {
306                 si->status = ATTO_STS_OUT_OF_RSRC;
307                 return false;
308         }
309
310         esas2r_start_request(a, rq);
311         return true;
312 }
313
314 static u8 handle_smp_ioctl(struct esas2r_adapter *a, struct atto_ioctl_smp *si)
315 {
316         struct esas2r_buffered_ioctl bi;
317
318         memset(&bi, 0, sizeof(bi));
319
320         bi.a = a;
321         bi.ioctl = si;
322         bi.length = sizeof(struct atto_ioctl_smp)
323                     + le32_to_cpu(si->req_length)
324                     + le32_to_cpu(si->rsp_length);
325         bi.offset = 0;
326         bi.callback = smp_ioctl_callback;
327         return handle_buffered_ioctl(&bi);
328 }
329
330
331 /* CSMI ioctl support */
332 static void esas2r_csmi_ioctl_tunnel_comp_cb(struct esas2r_adapter *a,
333                                              struct esas2r_request *rq)
334 {
335         rq->target_id = le16_to_cpu(rq->func_rsp.ioctl_rsp.csmi.target_id);
336         rq->vrq->scsi.flags |= cpu_to_le32(rq->func_rsp.ioctl_rsp.csmi.lun);
337
338         /* Now call the original completion callback. */
339         (*rq->aux_req_cb)(a, rq);
340 }
341
342 /* Tunnel a CSMI IOCTL to the back end driver for processing. */
343 static bool csmi_ioctl_tunnel(struct esas2r_adapter *a,
344                               union atto_ioctl_csmi *ci,
345                               struct esas2r_request *rq,
346                               struct esas2r_sg_context *sgc,
347                               u32 ctrl_code,
348                               u16 target_id)
349 {
350         struct atto_vda_ioctl_req *ioctl = &rq->vrq->ioctl;
351
352         if (test_bit(AF_DEGRADED_MODE, &a->flags))
353                 return false;
354
355         esas2r_sgc_init(sgc, a, rq, rq->vrq->ioctl.sge);
356         esas2r_build_ioctl_req(a, rq, sgc->length, VDA_IOCTL_CSMI);
357         ioctl->csmi.ctrl_code = cpu_to_le32(ctrl_code);
358         ioctl->csmi.target_id = cpu_to_le16(target_id);
359         ioctl->csmi.lun = (u8)le32_to_cpu(rq->vrq->scsi.flags);
360
361         /*
362          * Always usurp the completion callback since the interrupt callback
363          * mechanism may be used.
364          */
365         rq->aux_req_cx = ci;
366         rq->aux_req_cb = rq->comp_cb;
367         rq->comp_cb = esas2r_csmi_ioctl_tunnel_comp_cb;
368
369         if (!esas2r_build_sg_list(a, rq, sgc))
370                 return false;
371
372         esas2r_start_request(a, rq);
373         return true;
374 }
375
376 static bool check_lun(struct scsi_lun lun)
377 {
378         bool result;
379
380         result = ((lun.scsi_lun[7] == 0) &&
381                   (lun.scsi_lun[6] == 0) &&
382                   (lun.scsi_lun[5] == 0) &&
383                   (lun.scsi_lun[4] == 0) &&
384                   (lun.scsi_lun[3] == 0) &&
385                   (lun.scsi_lun[2] == 0) &&
386 /* Byte 1 is intentionally skipped */
387                   (lun.scsi_lun[0] == 0));
388
389         return result;
390 }
391
392 static int csmi_ioctl_callback(struct esas2r_adapter *a,
393                                struct esas2r_request *rq,
394                                struct esas2r_sg_context *sgc, void *context)
395 {
396         struct atto_csmi *ci = (struct atto_csmi *)context;
397         union atto_ioctl_csmi *ioctl_csmi =
398                 (union atto_ioctl_csmi *)esas2r_buffered_ioctl;
399         u8 path = 0;
400         u8 tid = 0;
401         u8 lun = 0;
402         u32 sts = CSMI_STS_SUCCESS;
403         struct esas2r_target *t;
404         unsigned long flags;
405
406         if (ci->control_code == CSMI_CC_GET_DEV_ADDR) {
407                 struct atto_csmi_get_dev_addr *gda = &ci->data.dev_addr;
408
409                 path = gda->path_id;
410                 tid = gda->target_id;
411                 lun = gda->lun;
412         } else if (ci->control_code == CSMI_CC_TASK_MGT) {
413                 struct atto_csmi_task_mgmt *tm = &ci->data.tsk_mgt;
414
415                 path = tm->path_id;
416                 tid = tm->target_id;
417                 lun = tm->lun;
418         }
419
420         if (path > 0) {
421                 rq->func_rsp.ioctl_rsp.csmi.csmi_status = cpu_to_le32(
422                         CSMI_STS_INV_PARAM);
423                 return false;
424         }
425
426         rq->target_id = tid;
427         rq->vrq->scsi.flags |= cpu_to_le32(lun);
428
429         switch (ci->control_code) {
430         case CSMI_CC_GET_DRVR_INFO:
431         {
432                 struct atto_csmi_get_driver_info *gdi = &ioctl_csmi->drvr_info;
433
434                 strcpy(gdi->description, esas2r_get_model_name(a));
435                 gdi->csmi_major_rev = CSMI_MAJOR_REV;
436                 gdi->csmi_minor_rev = CSMI_MINOR_REV;
437                 break;
438         }
439
440         case CSMI_CC_GET_CNTLR_CFG:
441         {
442                 struct atto_csmi_get_cntlr_cfg *gcc = &ioctl_csmi->cntlr_cfg;
443
444                 gcc->base_io_addr = 0;
445                 pci_read_config_dword(a->pcid, PCI_BASE_ADDRESS_2,
446                                       &gcc->base_memaddr_lo);
447                 pci_read_config_dword(a->pcid, PCI_BASE_ADDRESS_3,
448                                       &gcc->base_memaddr_hi);
449                 gcc->board_id = MAKEDWORD(a->pcid->subsystem_device,
450                                           a->pcid->subsystem_vendor);
451                 gcc->slot_num = CSMI_SLOT_NUM_UNKNOWN;
452                 gcc->cntlr_class = CSMI_CNTLR_CLASS_HBA;
453                 gcc->io_bus_type = CSMI_BUS_TYPE_PCI;
454                 gcc->pci_addr.bus_num = a->pcid->bus->number;
455                 gcc->pci_addr.device_num = PCI_SLOT(a->pcid->devfn);
456                 gcc->pci_addr.function_num = PCI_FUNC(a->pcid->devfn);
457
458                 memset(gcc->serial_num, 0, sizeof(gcc->serial_num));
459
460                 gcc->major_rev = LOBYTE(LOWORD(a->fw_version));
461                 gcc->minor_rev = HIBYTE(LOWORD(a->fw_version));
462                 gcc->build_rev = LOBYTE(HIWORD(a->fw_version));
463                 gcc->release_rev = HIBYTE(HIWORD(a->fw_version));
464                 gcc->bios_major_rev = HIBYTE(HIWORD(a->flash_ver));
465                 gcc->bios_minor_rev = LOBYTE(HIWORD(a->flash_ver));
466                 gcc->bios_build_rev = LOWORD(a->flash_ver);
467
468                 if (test_bit(AF2_THUNDERLINK, &a->flags2))
469                         gcc->cntlr_flags = CSMI_CNTLRF_SAS_HBA
470                                            | CSMI_CNTLRF_SATA_HBA;
471                 else
472                         gcc->cntlr_flags = CSMI_CNTLRF_SAS_RAID
473                                            | CSMI_CNTLRF_SATA_RAID;
474
475                 gcc->rrom_major_rev = 0;
476                 gcc->rrom_minor_rev = 0;
477                 gcc->rrom_build_rev = 0;
478                 gcc->rrom_release_rev = 0;
479                 gcc->rrom_biosmajor_rev = 0;
480                 gcc->rrom_biosminor_rev = 0;
481                 gcc->rrom_biosbuild_rev = 0;
482                 gcc->rrom_biosrelease_rev = 0;
483                 break;
484         }
485
486         case CSMI_CC_GET_CNTLR_STS:
487         {
488                 struct atto_csmi_get_cntlr_sts *gcs = &ioctl_csmi->cntlr_sts;
489
490                 if (test_bit(AF_DEGRADED_MODE, &a->flags))
491                         gcs->status = CSMI_CNTLR_STS_FAILED;
492                 else
493                         gcs->status = CSMI_CNTLR_STS_GOOD;
494
495                 gcs->offline_reason = CSMI_OFFLINE_NO_REASON;
496                 break;
497         }
498
499         case CSMI_CC_FW_DOWNLOAD:
500         case CSMI_CC_GET_RAID_INFO:
501         case CSMI_CC_GET_RAID_CFG:
502
503                 sts = CSMI_STS_BAD_CTRL_CODE;
504                 break;
505
506         case CSMI_CC_SMP_PASSTHRU:
507         case CSMI_CC_SSP_PASSTHRU:
508         case CSMI_CC_STP_PASSTHRU:
509         case CSMI_CC_GET_PHY_INFO:
510         case CSMI_CC_SET_PHY_INFO:
511         case CSMI_CC_GET_LINK_ERRORS:
512         case CSMI_CC_GET_SATA_SIG:
513         case CSMI_CC_GET_CONN_INFO:
514         case CSMI_CC_PHY_CTRL:
515
516                 if (!csmi_ioctl_tunnel(a, ioctl_csmi, rq, sgc,
517                                        ci->control_code,
518                                        ESAS2R_TARG_ID_INV)) {
519                         sts = CSMI_STS_FAILED;
520                         break;
521                 }
522
523                 return true;
524
525         case CSMI_CC_GET_SCSI_ADDR:
526         {
527                 struct atto_csmi_get_scsi_addr *gsa = &ioctl_csmi->scsi_addr;
528
529                 struct scsi_lun lun;
530
531                 memcpy(&lun, gsa->sas_lun, sizeof(struct scsi_lun));
532
533                 if (!check_lun(lun)) {
534                         sts = CSMI_STS_NO_SCSI_ADDR;
535                         break;
536                 }
537
538                 /* make sure the device is present */
539                 spin_lock_irqsave(&a->mem_lock, flags);
540                 t = esas2r_targ_db_find_by_sas_addr(a, (u64 *)gsa->sas_addr);
541                 spin_unlock_irqrestore(&a->mem_lock, flags);
542
543                 if (t == NULL) {
544                         sts = CSMI_STS_NO_SCSI_ADDR;
545                         break;
546                 }
547
548                 gsa->host_index = 0xFF;
549                 gsa->lun = gsa->sas_lun[1];
550                 rq->target_id = esas2r_targ_get_id(t, a);
551                 break;
552         }
553
554         case CSMI_CC_GET_DEV_ADDR:
555         {
556                 struct atto_csmi_get_dev_addr *gda = &ioctl_csmi->dev_addr;
557
558                 /* make sure the target is present */
559                 t = a->targetdb + rq->target_id;
560
561                 if (t >= a->targetdb_end
562                     || t->target_state != TS_PRESENT
563                     || t->sas_addr == 0) {
564                         sts = CSMI_STS_NO_DEV_ADDR;
565                         break;
566                 }
567
568                 /* fill in the result */
569                 *(u64 *)gda->sas_addr = t->sas_addr;
570                 memset(gda->sas_lun, 0, sizeof(gda->sas_lun));
571                 gda->sas_lun[1] = (u8)le32_to_cpu(rq->vrq->scsi.flags);
572                 break;
573         }
574
575         case CSMI_CC_TASK_MGT:
576
577                 /* make sure the target is present */
578                 t = a->targetdb + rq->target_id;
579
580                 if (t >= a->targetdb_end
581                     || t->target_state != TS_PRESENT
582                     || !(t->flags & TF_PASS_THRU)) {
583                         sts = CSMI_STS_NO_DEV_ADDR;
584                         break;
585                 }
586
587                 if (!csmi_ioctl_tunnel(a, ioctl_csmi, rq, sgc,
588                                        ci->control_code,
589                                        t->phys_targ_id)) {
590                         sts = CSMI_STS_FAILED;
591                         break;
592                 }
593
594                 return true;
595
596         default:
597
598                 sts = CSMI_STS_BAD_CTRL_CODE;
599                 break;
600         }
601
602         rq->func_rsp.ioctl_rsp.csmi.csmi_status = cpu_to_le32(sts);
603
604         return false;
605 }
606
607
608 static void csmi_ioctl_done_callback(struct esas2r_adapter *a,
609                                      struct esas2r_request *rq, void *context)
610 {
611         struct atto_csmi *ci = (struct atto_csmi *)context;
612         union atto_ioctl_csmi *ioctl_csmi =
613                 (union atto_ioctl_csmi *)esas2r_buffered_ioctl;
614
615         switch (ci->control_code) {
616         case CSMI_CC_GET_DRVR_INFO:
617         {
618                 struct atto_csmi_get_driver_info *gdi =
619                         &ioctl_csmi->drvr_info;
620
621                 strcpy(gdi->name, ESAS2R_VERSION_STR);
622
623                 gdi->major_rev = ESAS2R_MAJOR_REV;
624                 gdi->minor_rev = ESAS2R_MINOR_REV;
625                 gdi->build_rev = 0;
626                 gdi->release_rev = 0;
627                 break;
628         }
629
630         case CSMI_CC_GET_SCSI_ADDR:
631         {
632                 struct atto_csmi_get_scsi_addr *gsa = &ioctl_csmi->scsi_addr;
633
634                 if (le32_to_cpu(rq->func_rsp.ioctl_rsp.csmi.csmi_status) ==
635                     CSMI_STS_SUCCESS) {
636                         gsa->target_id = rq->target_id;
637                         gsa->path_id = 0;
638                 }
639
640                 break;
641         }
642         }
643
644         ci->status = le32_to_cpu(rq->func_rsp.ioctl_rsp.csmi.csmi_status);
645 }
646
647
648 static u8 handle_csmi_ioctl(struct esas2r_adapter *a, struct atto_csmi *ci)
649 {
650         struct esas2r_buffered_ioctl bi;
651
652         memset(&bi, 0, sizeof(bi));
653
654         bi.a = a;
655         bi.ioctl = &ci->data;
656         bi.length = sizeof(union atto_ioctl_csmi);
657         bi.offset = 0;
658         bi.callback = csmi_ioctl_callback;
659         bi.context = ci;
660         bi.done_callback = csmi_ioctl_done_callback;
661         bi.done_context = ci;
662
663         return handle_buffered_ioctl(&bi);
664 }
665
666 /* ATTO HBA ioctl support */
667
668 /* Tunnel an ATTO HBA IOCTL to the back end driver for processing. */
669 static bool hba_ioctl_tunnel(struct esas2r_adapter *a,
670                              struct atto_ioctl *hi,
671                              struct esas2r_request *rq,
672                              struct esas2r_sg_context *sgc)
673 {
674         esas2r_sgc_init(sgc, a, rq, rq->vrq->ioctl.sge);
675
676         esas2r_build_ioctl_req(a, rq, sgc->length, VDA_IOCTL_HBA);
677
678         if (!esas2r_build_sg_list(a, rq, sgc)) {
679                 hi->status = ATTO_STS_OUT_OF_RSRC;
680
681                 return false;
682         }
683
684         esas2r_start_request(a, rq);
685
686         return true;
687 }
688
689 static void scsi_passthru_comp_cb(struct esas2r_adapter *a,
690                                   struct esas2r_request *rq)
691 {
692         struct atto_ioctl *hi = (struct atto_ioctl *)rq->aux_req_cx;
693         struct atto_hba_scsi_pass_thru *spt = &hi->data.scsi_pass_thru;
694         u8 sts = ATTO_SPT_RS_FAILED;
695
696         spt->scsi_status = rq->func_rsp.scsi_rsp.scsi_stat;
697         spt->sense_length = rq->sense_len;
698         spt->residual_length =
699                 le32_to_cpu(rq->func_rsp.scsi_rsp.residual_length);
700
701         switch (rq->req_stat) {
702         case RS_SUCCESS:
703         case RS_SCSI_ERROR:
704                 sts = ATTO_SPT_RS_SUCCESS;
705                 break;
706         case RS_UNDERRUN:
707                 sts = ATTO_SPT_RS_UNDERRUN;
708                 break;
709         case RS_OVERRUN:
710                 sts = ATTO_SPT_RS_OVERRUN;
711                 break;
712         case RS_SEL:
713         case RS_SEL2:
714                 sts = ATTO_SPT_RS_NO_DEVICE;
715                 break;
716         case RS_NO_LUN:
717                 sts = ATTO_SPT_RS_NO_LUN;
718                 break;
719         case RS_TIMEOUT:
720                 sts = ATTO_SPT_RS_TIMEOUT;
721                 break;
722         case RS_DEGRADED:
723                 sts = ATTO_SPT_RS_DEGRADED;
724                 break;
725         case RS_BUSY:
726                 sts = ATTO_SPT_RS_BUSY;
727                 break;
728         case RS_ABORTED:
729                 sts = ATTO_SPT_RS_ABORTED;
730                 break;
731         case RS_RESET:
732                 sts = ATTO_SPT_RS_BUS_RESET;
733                 break;
734         }
735
736         spt->req_status = sts;
737
738         /* Update the target ID to the next one present. */
739         spt->target_id =
740                 esas2r_targ_db_find_next_present(a, (u16)spt->target_id);
741
742         /* Done, call the completion callback. */
743         (*rq->aux_req_cb)(a, rq);
744 }
745
746 static int hba_ioctl_callback(struct esas2r_adapter *a,
747                               struct esas2r_request *rq,
748                               struct esas2r_sg_context *sgc,
749                               void *context)
750 {
751         struct atto_ioctl *hi = (struct atto_ioctl *)esas2r_buffered_ioctl;
752
753         hi->status = ATTO_STS_SUCCESS;
754
755         switch (hi->function) {
756         case ATTO_FUNC_GET_ADAP_INFO:
757         {
758                 u8 *class_code = (u8 *)&a->pcid->class;
759
760                 struct atto_hba_get_adapter_info *gai =
761                         &hi->data.get_adap_info;
762
763                 if (hi->flags & HBAF_TUNNEL) {
764                         hi->status = ATTO_STS_UNSUPPORTED;
765                         break;
766                 }
767
768                 if (hi->version > ATTO_VER_GET_ADAP_INFO0) {
769                         hi->status = ATTO_STS_INV_VERSION;
770                         hi->version = ATTO_VER_GET_ADAP_INFO0;
771                         break;
772                 }
773
774                 memset(gai, 0, sizeof(*gai));
775
776                 gai->pci.vendor_id = a->pcid->vendor;
777                 gai->pci.device_id = a->pcid->device;
778                 gai->pci.ss_vendor_id = a->pcid->subsystem_vendor;
779                 gai->pci.ss_device_id = a->pcid->subsystem_device;
780                 gai->pci.class_code[0] = class_code[0];
781                 gai->pci.class_code[1] = class_code[1];
782                 gai->pci.class_code[2] = class_code[2];
783                 gai->pci.rev_id = a->pcid->revision;
784                 gai->pci.bus_num = a->pcid->bus->number;
785                 gai->pci.dev_num = PCI_SLOT(a->pcid->devfn);
786                 gai->pci.func_num = PCI_FUNC(a->pcid->devfn);
787
788                 if (pci_is_pcie(a->pcid)) {
789                         u16 stat;
790                         u32 caps;
791
792                         pcie_capability_read_word(a->pcid, PCI_EXP_LNKSTA,
793                                                   &stat);
794                         pcie_capability_read_dword(a->pcid, PCI_EXP_LNKCAP,
795                                                    &caps);
796
797                         gai->pci.link_speed_curr = FIELD_GET(PCI_EXP_LNKSTA_CLS, stat);
798                         gai->pci.link_speed_max = FIELD_GET(PCI_EXP_LNKCAP_SLS, caps);
799                         gai->pci.link_width_curr = FIELD_GET(PCI_EXP_LNKSTA_NLW, stat);
800                         gai->pci.link_width_max = FIELD_GET(PCI_EXP_LNKCAP_MLW, caps);
801                 }
802
803                 gai->pci.msi_vector_cnt = 1;
804
805                 if (a->pcid->msix_enabled)
806                         gai->pci.interrupt_mode = ATTO_GAI_PCIIM_MSIX;
807                 else if (a->pcid->msi_enabled)
808                         gai->pci.interrupt_mode = ATTO_GAI_PCIIM_MSI;
809                 else
810                         gai->pci.interrupt_mode = ATTO_GAI_PCIIM_LEGACY;
811
812                 gai->adap_type = ATTO_GAI_AT_ESASRAID2;
813
814                 if (test_bit(AF2_THUNDERLINK, &a->flags2))
815                         gai->adap_type = ATTO_GAI_AT_TLSASHBA;
816
817                 if (test_bit(AF_DEGRADED_MODE, &a->flags))
818                         gai->adap_flags |= ATTO_GAI_AF_DEGRADED;
819
820                 gai->adap_flags |= ATTO_GAI_AF_SPT_SUPP |
821                                    ATTO_GAI_AF_DEVADDR_SUPP;
822
823                 if (a->pcid->subsystem_device == ATTO_ESAS_R60F
824                     || a->pcid->subsystem_device == ATTO_ESAS_R608
825                     || a->pcid->subsystem_device == ATTO_ESAS_R644
826                     || a->pcid->subsystem_device == ATTO_TSSC_3808E)
827                         gai->adap_flags |= ATTO_GAI_AF_VIRT_SES;
828
829                 gai->num_ports = ESAS2R_NUM_PHYS;
830                 gai->num_phys = ESAS2R_NUM_PHYS;
831
832                 strcpy(gai->firmware_rev, a->fw_rev);
833                 strcpy(gai->flash_rev, a->flash_rev);
834                 strcpy(gai->model_name_short, esas2r_get_model_name_short(a));
835                 strcpy(gai->model_name, esas2r_get_model_name(a));
836
837                 gai->num_targets = ESAS2R_MAX_TARGETS;
838
839                 gai->num_busses = 1;
840                 gai->num_targsper_bus = gai->num_targets;
841                 gai->num_lunsper_targ = 256;
842
843                 if (a->pcid->subsystem_device == ATTO_ESAS_R6F0
844                     || a->pcid->subsystem_device == ATTO_ESAS_R60F)
845                         gai->num_connectors = 4;
846                 else
847                         gai->num_connectors = 2;
848
849                 gai->adap_flags2 |= ATTO_GAI_AF2_ADAP_CTRL_SUPP;
850
851                 gai->num_targets_backend = a->num_targets_backend;
852
853                 gai->tunnel_flags = a->ioctl_tunnel
854                                     & (ATTO_GAI_TF_MEM_RW
855                                        | ATTO_GAI_TF_TRACE
856                                        | ATTO_GAI_TF_SCSI_PASS_THRU
857                                        | ATTO_GAI_TF_GET_DEV_ADDR
858                                        | ATTO_GAI_TF_PHY_CTRL
859                                        | ATTO_GAI_TF_CONN_CTRL
860                                        | ATTO_GAI_TF_GET_DEV_INFO);
861                 break;
862         }
863
864         case ATTO_FUNC_GET_ADAP_ADDR:
865         {
866                 struct atto_hba_get_adapter_address *gaa =
867                         &hi->data.get_adap_addr;
868
869                 if (hi->flags & HBAF_TUNNEL) {
870                         hi->status = ATTO_STS_UNSUPPORTED;
871                         break;
872                 }
873
874                 if (hi->version > ATTO_VER_GET_ADAP_ADDR0) {
875                         hi->status = ATTO_STS_INV_VERSION;
876                         hi->version = ATTO_VER_GET_ADAP_ADDR0;
877                 } else if (gaa->addr_type == ATTO_GAA_AT_PORT
878                            || gaa->addr_type == ATTO_GAA_AT_NODE) {
879                         if (gaa->addr_type == ATTO_GAA_AT_PORT
880                             && gaa->port_id >= ESAS2R_NUM_PHYS) {
881                                 hi->status = ATTO_STS_NOT_APPL;
882                         } else {
883                                 memcpy((u64 *)gaa->address,
884                                        &a->nvram->sas_addr[0], sizeof(u64));
885                                 gaa->addr_len = sizeof(u64);
886                         }
887                 } else {
888                         hi->status = ATTO_STS_INV_PARAM;
889                 }
890
891                 break;
892         }
893
894         case ATTO_FUNC_MEM_RW:
895         {
896                 if (hi->flags & HBAF_TUNNEL) {
897                         if (hba_ioctl_tunnel(a, hi, rq, sgc))
898                                 return true;
899
900                         break;
901                 }
902
903                 hi->status = ATTO_STS_UNSUPPORTED;
904
905                 break;
906         }
907
908         case ATTO_FUNC_TRACE:
909         {
910                 struct atto_hba_trace *trc = &hi->data.trace;
911
912                 if (hi->flags & HBAF_TUNNEL) {
913                         if (hba_ioctl_tunnel(a, hi, rq, sgc))
914                                 return true;
915
916                         break;
917                 }
918
919                 if (hi->version > ATTO_VER_TRACE1) {
920                         hi->status = ATTO_STS_INV_VERSION;
921                         hi->version = ATTO_VER_TRACE1;
922                         break;
923                 }
924
925                 if (trc->trace_type == ATTO_TRC_TT_FWCOREDUMP
926                     && hi->version >= ATTO_VER_TRACE1) {
927                         if (trc->trace_func == ATTO_TRC_TF_UPLOAD) {
928                                 u32 len = hi->data_length;
929                                 u32 offset = trc->current_offset;
930                                 u32 total_len = ESAS2R_FWCOREDUMP_SZ;
931
932                                 /* Size is zero if a core dump isn't present */
933                                 if (!test_bit(AF2_COREDUMP_SAVED, &a->flags2))
934                                         total_len = 0;
935
936                                 if (len > total_len)
937                                         len = total_len;
938
939                                 if (offset >= total_len
940                                     || offset + len > total_len
941                                     || len == 0) {
942                                         hi->status = ATTO_STS_INV_PARAM;
943                                         break;
944                                 }
945
946                                 memcpy(trc->contents,
947                                        a->fw_coredump_buff + offset,
948                                        len);
949                                 hi->data_length = len;
950                         } else if (trc->trace_func == ATTO_TRC_TF_RESET) {
951                                 memset(a->fw_coredump_buff, 0,
952                                        ESAS2R_FWCOREDUMP_SZ);
953
954                                 clear_bit(AF2_COREDUMP_SAVED, &a->flags2);
955                         } else if (trc->trace_func != ATTO_TRC_TF_GET_INFO) {
956                                 hi->status = ATTO_STS_UNSUPPORTED;
957                                 break;
958                         }
959
960                         /* Always return all the info we can. */
961                         trc->trace_mask = 0;
962                         trc->current_offset = 0;
963                         trc->total_length = ESAS2R_FWCOREDUMP_SZ;
964
965                         /* Return zero length buffer if core dump not present */
966                         if (!test_bit(AF2_COREDUMP_SAVED, &a->flags2))
967                                 trc->total_length = 0;
968                 } else {
969                         hi->status = ATTO_STS_UNSUPPORTED;
970                 }
971
972                 break;
973         }
974
975         case ATTO_FUNC_SCSI_PASS_THRU:
976         {
977                 struct atto_hba_scsi_pass_thru *spt = &hi->data.scsi_pass_thru;
978                 struct scsi_lun lun;
979
980                 memcpy(&lun, spt->lun, sizeof(struct scsi_lun));
981
982                 if (hi->flags & HBAF_TUNNEL) {
983                         if (hba_ioctl_tunnel(a, hi, rq, sgc))
984                                 return true;
985
986                         break;
987                 }
988
989                 if (hi->version > ATTO_VER_SCSI_PASS_THRU0) {
990                         hi->status = ATTO_STS_INV_VERSION;
991                         hi->version = ATTO_VER_SCSI_PASS_THRU0;
992                         break;
993                 }
994
995                 if (spt->target_id >= ESAS2R_MAX_TARGETS || !check_lun(lun)) {
996                         hi->status = ATTO_STS_INV_PARAM;
997                         break;
998                 }
999
1000                 esas2r_sgc_init(sgc, a, rq, NULL);
1001
1002                 sgc->length = hi->data_length;
1003                 sgc->cur_offset += offsetof(struct atto_ioctl, data.byte)
1004                                    + sizeof(struct atto_hba_scsi_pass_thru);
1005
1006                 /* Finish request initialization */
1007                 rq->target_id = (u16)spt->target_id;
1008                 rq->vrq->scsi.flags |= cpu_to_le32(spt->lun[1]);
1009                 memcpy(rq->vrq->scsi.cdb, spt->cdb, 16);
1010                 rq->vrq->scsi.length = cpu_to_le32(hi->data_length);
1011                 rq->sense_len = spt->sense_length;
1012                 rq->sense_buf = (u8 *)spt->sense_data;
1013                 /* NOTE: we ignore spt->timeout */
1014
1015                 /*
1016                  * always usurp the completion callback since the interrupt
1017                  * callback mechanism may be used.
1018                  */
1019
1020                 rq->aux_req_cx = hi;
1021                 rq->aux_req_cb = rq->comp_cb;
1022                 rq->comp_cb = scsi_passthru_comp_cb;
1023
1024                 if (spt->flags & ATTO_SPTF_DATA_IN) {
1025                         rq->vrq->scsi.flags |= cpu_to_le32(FCP_CMND_RDD);
1026                 } else if (spt->flags & ATTO_SPTF_DATA_OUT) {
1027                         rq->vrq->scsi.flags |= cpu_to_le32(FCP_CMND_WRD);
1028                 } else {
1029                         if (sgc->length) {
1030                                 hi->status = ATTO_STS_INV_PARAM;
1031                                 break;
1032                         }
1033                 }
1034
1035                 if (spt->flags & ATTO_SPTF_ORDERED_Q)
1036                         rq->vrq->scsi.flags |=
1037                                 cpu_to_le32(FCP_CMND_TA_ORDRD_Q);
1038                 else if (spt->flags & ATTO_SPTF_HEAD_OF_Q)
1039                         rq->vrq->scsi.flags |= cpu_to_le32(FCP_CMND_TA_HEAD_Q);
1040
1041
1042                 if (!esas2r_build_sg_list(a, rq, sgc)) {
1043                         hi->status = ATTO_STS_OUT_OF_RSRC;
1044                         break;
1045                 }
1046
1047                 esas2r_start_request(a, rq);
1048
1049                 return true;
1050         }
1051
1052         case ATTO_FUNC_GET_DEV_ADDR:
1053         {
1054                 struct atto_hba_get_device_address *gda =
1055                         &hi->data.get_dev_addr;
1056                 struct esas2r_target *t;
1057
1058                 if (hi->flags & HBAF_TUNNEL) {
1059                         if (hba_ioctl_tunnel(a, hi, rq, sgc))
1060                                 return true;
1061
1062                         break;
1063                 }
1064
1065                 if (hi->version > ATTO_VER_GET_DEV_ADDR0) {
1066                         hi->status = ATTO_STS_INV_VERSION;
1067                         hi->version = ATTO_VER_GET_DEV_ADDR0;
1068                         break;
1069                 }
1070
1071                 if (gda->target_id >= ESAS2R_MAX_TARGETS) {
1072                         hi->status = ATTO_STS_INV_PARAM;
1073                         break;
1074                 }
1075
1076                 t = a->targetdb + (u16)gda->target_id;
1077
1078                 if (t->target_state != TS_PRESENT) {
1079                         hi->status = ATTO_STS_FAILED;
1080                 } else if (gda->addr_type == ATTO_GDA_AT_PORT) {
1081                         if (t->sas_addr == 0) {
1082                                 hi->status = ATTO_STS_UNSUPPORTED;
1083                         } else {
1084                                 *(u64 *)gda->address = t->sas_addr;
1085
1086                                 gda->addr_len = sizeof(u64);
1087                         }
1088                 } else if (gda->addr_type == ATTO_GDA_AT_NODE) {
1089                         hi->status = ATTO_STS_NOT_APPL;
1090                 } else {
1091                         hi->status = ATTO_STS_INV_PARAM;
1092                 }
1093
1094                 /* update the target ID to the next one present. */
1095
1096                 gda->target_id =
1097                         esas2r_targ_db_find_next_present(a,
1098                                                          (u16)gda->target_id);
1099                 break;
1100         }
1101
1102         case ATTO_FUNC_PHY_CTRL:
1103         case ATTO_FUNC_CONN_CTRL:
1104         {
1105                 if (hba_ioctl_tunnel(a, hi, rq, sgc))
1106                         return true;
1107
1108                 break;
1109         }
1110
1111         case ATTO_FUNC_ADAP_CTRL:
1112         {
1113                 struct atto_hba_adap_ctrl *ac = &hi->data.adap_ctrl;
1114
1115                 if (hi->flags & HBAF_TUNNEL) {
1116                         hi->status = ATTO_STS_UNSUPPORTED;
1117                         break;
1118                 }
1119
1120                 if (hi->version > ATTO_VER_ADAP_CTRL0) {
1121                         hi->status = ATTO_STS_INV_VERSION;
1122                         hi->version = ATTO_VER_ADAP_CTRL0;
1123                         break;
1124                 }
1125
1126                 if (ac->adap_func == ATTO_AC_AF_HARD_RST) {
1127                         esas2r_reset_adapter(a);
1128                 } else if (ac->adap_func != ATTO_AC_AF_GET_STATE) {
1129                         hi->status = ATTO_STS_UNSUPPORTED;
1130                         break;
1131                 }
1132
1133                 if (test_bit(AF_CHPRST_NEEDED, &a->flags))
1134                         ac->adap_state = ATTO_AC_AS_RST_SCHED;
1135                 else if (test_bit(AF_CHPRST_PENDING, &a->flags))
1136                         ac->adap_state = ATTO_AC_AS_RST_IN_PROG;
1137                 else if (test_bit(AF_DISC_PENDING, &a->flags))
1138                         ac->adap_state = ATTO_AC_AS_RST_DISC;
1139                 else if (test_bit(AF_DISABLED, &a->flags))
1140                         ac->adap_state = ATTO_AC_AS_DISABLED;
1141                 else if (test_bit(AF_DEGRADED_MODE, &a->flags))
1142                         ac->adap_state = ATTO_AC_AS_DEGRADED;
1143                 else
1144                         ac->adap_state = ATTO_AC_AS_OK;
1145
1146                 break;
1147         }
1148
1149         case ATTO_FUNC_GET_DEV_INFO:
1150         {
1151                 struct atto_hba_get_device_info *gdi = &hi->data.get_dev_info;
1152                 struct esas2r_target *t;
1153
1154                 if (hi->flags & HBAF_TUNNEL) {
1155                         if (hba_ioctl_tunnel(a, hi, rq, sgc))
1156                                 return true;
1157
1158                         break;
1159                 }
1160
1161                 if (hi->version > ATTO_VER_GET_DEV_INFO0) {
1162                         hi->status = ATTO_STS_INV_VERSION;
1163                         hi->version = ATTO_VER_GET_DEV_INFO0;
1164                         break;
1165                 }
1166
1167                 if (gdi->target_id >= ESAS2R_MAX_TARGETS) {
1168                         hi->status = ATTO_STS_INV_PARAM;
1169                         break;
1170                 }
1171
1172                 t = a->targetdb + (u16)gdi->target_id;
1173
1174                 /* update the target ID to the next one present. */
1175
1176                 gdi->target_id =
1177                         esas2r_targ_db_find_next_present(a,
1178                                                          (u16)gdi->target_id);
1179
1180                 if (t->target_state != TS_PRESENT) {
1181                         hi->status = ATTO_STS_FAILED;
1182                         break;
1183                 }
1184
1185                 hi->status = ATTO_STS_UNSUPPORTED;
1186                 break;
1187         }
1188
1189         default:
1190
1191                 hi->status = ATTO_STS_INV_FUNC;
1192                 break;
1193         }
1194
1195         return false;
1196 }
1197
1198 static void hba_ioctl_done_callback(struct esas2r_adapter *a,
1199                                     struct esas2r_request *rq, void *context)
1200 {
1201         struct atto_ioctl *ioctl_hba =
1202                 (struct atto_ioctl *)esas2r_buffered_ioctl;
1203
1204         esas2r_debug("hba_ioctl_done_callback %d", a->index);
1205
1206         if (ioctl_hba->function == ATTO_FUNC_GET_ADAP_INFO) {
1207                 struct atto_hba_get_adapter_info *gai =
1208                         &ioctl_hba->data.get_adap_info;
1209
1210                 esas2r_debug("ATTO_FUNC_GET_ADAP_INFO");
1211
1212                 gai->drvr_rev_major = ESAS2R_MAJOR_REV;
1213                 gai->drvr_rev_minor = ESAS2R_MINOR_REV;
1214
1215                 strcpy(gai->drvr_rev_ascii, ESAS2R_VERSION_STR);
1216                 strcpy(gai->drvr_name, ESAS2R_DRVR_NAME);
1217
1218                 gai->num_busses = 1;
1219                 gai->num_targsper_bus = ESAS2R_MAX_ID + 1;
1220                 gai->num_lunsper_targ = 1;
1221         }
1222 }
1223
1224 u8 handle_hba_ioctl(struct esas2r_adapter *a,
1225                     struct atto_ioctl *ioctl_hba)
1226 {
1227         struct esas2r_buffered_ioctl bi;
1228
1229         memset(&bi, 0, sizeof(bi));
1230
1231         bi.a = a;
1232         bi.ioctl = ioctl_hba;
1233         bi.length = sizeof(struct atto_ioctl) + ioctl_hba->data_length;
1234         bi.callback = hba_ioctl_callback;
1235         bi.context = NULL;
1236         bi.done_callback = hba_ioctl_done_callback;
1237         bi.done_context = NULL;
1238         bi.offset = 0;
1239
1240         return handle_buffered_ioctl(&bi);
1241 }
1242
1243
1244 int esas2r_write_params(struct esas2r_adapter *a, struct esas2r_request *rq,
1245                         struct esas2r_sas_nvram *data)
1246 {
1247         int result = 0;
1248
1249         a->nvram_command_done = 0;
1250         rq->comp_cb = complete_nvr_req;
1251
1252         if (esas2r_nvram_write(a, rq, data)) {
1253                 /* now wait around for it to complete. */
1254                 while (!a->nvram_command_done)
1255                         wait_event_interruptible(a->nvram_waiter,
1256                                                  a->nvram_command_done);
1257                 ;
1258
1259                 /* done, check the status. */
1260                 if (rq->req_stat == RS_SUCCESS)
1261                         result = 1;
1262         }
1263         return result;
1264 }
1265
1266
1267 /* This function only cares about ATTO-specific ioctls (atto_express_ioctl) */
1268 int esas2r_ioctl_handler(void *hostdata, unsigned int cmd, void __user *arg)
1269 {
1270         struct atto_express_ioctl *ioctl = NULL;
1271         struct esas2r_adapter *a;
1272         struct esas2r_request *rq;
1273         u16 code;
1274         int err;
1275
1276         esas2r_log(ESAS2R_LOG_DEBG, "ioctl (%p, %x, %p)", hostdata, cmd, arg);
1277
1278         if ((arg == NULL)
1279             || (cmd < EXPRESS_IOCTL_MIN)
1280             || (cmd > EXPRESS_IOCTL_MAX))
1281                 return -ENOTSUPP;
1282
1283         ioctl = memdup_user(arg, sizeof(struct atto_express_ioctl));
1284         if (IS_ERR(ioctl)) {
1285                 esas2r_log(ESAS2R_LOG_WARN,
1286                            "ioctl_handler access_ok failed for cmd %u, address %p",
1287                            cmd, arg);
1288                 return PTR_ERR(ioctl);
1289         }
1290
1291         /* verify the signature */
1292
1293         if (memcmp(ioctl->header.signature,
1294                    EXPRESS_IOCTL_SIGNATURE,
1295                    EXPRESS_IOCTL_SIGNATURE_SIZE) != 0) {
1296                 esas2r_log(ESAS2R_LOG_WARN, "invalid signature");
1297                 kfree(ioctl);
1298
1299                 return -ENOTSUPP;
1300         }
1301
1302         /* assume success */
1303
1304         ioctl->header.return_code = IOCTL_SUCCESS;
1305         err = 0;
1306
1307         /*
1308          * handle EXPRESS_IOCTL_GET_CHANNELS
1309          * without paying attention to channel
1310          */
1311
1312         if (cmd == EXPRESS_IOCTL_GET_CHANNELS) {
1313                 int i = 0, k = 0;
1314
1315                 ioctl->data.chanlist.num_channels = 0;
1316
1317                 while (i < MAX_ADAPTERS) {
1318                         if (esas2r_adapters[i]) {
1319                                 ioctl->data.chanlist.num_channels++;
1320                                 ioctl->data.chanlist.channel[k] = i;
1321                                 k++;
1322                         }
1323                         i++;
1324                 }
1325
1326                 goto ioctl_done;
1327         }
1328
1329         /* get the channel */
1330
1331         if (ioctl->header.channel == 0xFF) {
1332                 a = (struct esas2r_adapter *)hostdata;
1333         } else {
1334                 if (ioctl->header.channel >= MAX_ADAPTERS ||
1335                         esas2r_adapters[ioctl->header.channel] == NULL) {
1336                         ioctl->header.return_code = IOCTL_BAD_CHANNEL;
1337                         esas2r_log(ESAS2R_LOG_WARN, "bad channel value");
1338                         kfree(ioctl);
1339
1340                         return -ENOTSUPP;
1341                 }
1342                 a = esas2r_adapters[ioctl->header.channel];
1343         }
1344
1345         switch (cmd) {
1346         case EXPRESS_IOCTL_RW_FIRMWARE:
1347
1348                 if (ioctl->data.fwrw.img_type == FW_IMG_FM_API) {
1349                         err = esas2r_write_fw(a,
1350                                               (char *)ioctl->data.fwrw.image,
1351                                               0,
1352                                               sizeof(struct
1353                                                      atto_express_ioctl));
1354
1355                         if (err >= 0) {
1356                                 err = esas2r_read_fw(a,
1357                                                      (char *)ioctl->data.fwrw.
1358                                                      image,
1359                                                      0,
1360                                                      sizeof(struct
1361                                                             atto_express_ioctl));
1362                         }
1363                 } else if (ioctl->data.fwrw.img_type == FW_IMG_FS_API) {
1364                         err = esas2r_write_fs(a,
1365                                               (char *)ioctl->data.fwrw.image,
1366                                               0,
1367                                               sizeof(struct
1368                                                      atto_express_ioctl));
1369
1370                         if (err >= 0) {
1371                                 err = esas2r_read_fs(a,
1372                                                      (char *)ioctl->data.fwrw.
1373                                                      image,
1374                                                      0,
1375                                                      sizeof(struct
1376                                                             atto_express_ioctl));
1377                         }
1378                 } else {
1379                         ioctl->header.return_code = IOCTL_BAD_FLASH_IMGTYPE;
1380                 }
1381
1382                 break;
1383
1384         case EXPRESS_IOCTL_READ_PARAMS:
1385
1386                 memcpy(ioctl->data.prw.data_buffer, a->nvram,
1387                        sizeof(struct esas2r_sas_nvram));
1388                 ioctl->data.prw.code = 1;
1389                 break;
1390
1391         case EXPRESS_IOCTL_WRITE_PARAMS:
1392
1393                 rq = esas2r_alloc_request(a);
1394                 if (rq == NULL) {
1395                         kfree(ioctl);
1396                         esas2r_log(ESAS2R_LOG_WARN,
1397                            "could not allocate an internal request");
1398                         return -ENOMEM;
1399                 }
1400
1401                 code = esas2r_write_params(a, rq,
1402                                            (struct esas2r_sas_nvram *)ioctl->data.prw.data_buffer);
1403                 ioctl->data.prw.code = code;
1404
1405                 esas2r_free_request(a, rq);
1406
1407                 break;
1408
1409         case EXPRESS_IOCTL_DEFAULT_PARAMS:
1410
1411                 esas2r_nvram_get_defaults(a,
1412                                           (struct esas2r_sas_nvram *)ioctl->data.prw.data_buffer);
1413                 ioctl->data.prw.code = 1;
1414                 break;
1415
1416         case EXPRESS_IOCTL_CHAN_INFO:
1417
1418                 ioctl->data.chaninfo.major_rev = ESAS2R_MAJOR_REV;
1419                 ioctl->data.chaninfo.minor_rev = ESAS2R_MINOR_REV;
1420                 ioctl->data.chaninfo.IRQ = a->pcid->irq;
1421                 ioctl->data.chaninfo.device_id = a->pcid->device;
1422                 ioctl->data.chaninfo.vendor_id = a->pcid->vendor;
1423                 ioctl->data.chaninfo.ven_dev_id = a->pcid->subsystem_device;
1424                 ioctl->data.chaninfo.revision_id = a->pcid->revision;
1425                 ioctl->data.chaninfo.pci_bus = a->pcid->bus->number;
1426                 ioctl->data.chaninfo.pci_dev_func = a->pcid->devfn;
1427                 ioctl->data.chaninfo.core_rev = 0;
1428                 ioctl->data.chaninfo.host_no = a->host->host_no;
1429                 ioctl->data.chaninfo.hbaapi_rev = 0;
1430                 break;
1431
1432         case EXPRESS_IOCTL_SMP:
1433                 ioctl->header.return_code = handle_smp_ioctl(a,
1434                                                              &ioctl->data.
1435                                                              ioctl_smp);
1436                 break;
1437
1438         case EXPRESS_CSMI:
1439                 ioctl->header.return_code =
1440                         handle_csmi_ioctl(a, &ioctl->data.csmi);
1441                 break;
1442
1443         case EXPRESS_IOCTL_HBA:
1444                 ioctl->header.return_code = handle_hba_ioctl(a,
1445                                                              &ioctl->data.
1446                                                              ioctl_hba);
1447                 break;
1448
1449         case EXPRESS_IOCTL_VDA:
1450                 err = esas2r_write_vda(a,
1451                                        (char *)&ioctl->data.ioctl_vda,
1452                                        0,
1453                                        sizeof(struct atto_ioctl_vda) +
1454                                        ioctl->data.ioctl_vda.data_length);
1455
1456                 if (err >= 0) {
1457                         err = esas2r_read_vda(a,
1458                                               (char *)&ioctl->data.ioctl_vda,
1459                                               0,
1460                                               sizeof(struct atto_ioctl_vda) +
1461                                               ioctl->data.ioctl_vda.data_length);
1462                 }
1463
1464
1465
1466
1467                 break;
1468
1469         case EXPRESS_IOCTL_GET_MOD_INFO:
1470
1471                 ioctl->data.modinfo.adapter = a;
1472                 ioctl->data.modinfo.pci_dev = a->pcid;
1473                 ioctl->data.modinfo.scsi_host = a->host;
1474                 ioctl->data.modinfo.host_no = a->host->host_no;
1475
1476                 break;
1477
1478         default:
1479                 esas2r_debug("esas2r_ioctl invalid cmd %p!", cmd);
1480                 ioctl->header.return_code = IOCTL_ERR_INVCMD;
1481         }
1482
1483 ioctl_done:
1484
1485         if (err < 0) {
1486                 esas2r_log(ESAS2R_LOG_WARN, "err %d on ioctl cmd %u", err,
1487                            cmd);
1488
1489                 switch (err) {
1490                 case -ENOMEM:
1491                 case -EBUSY:
1492                         ioctl->header.return_code = IOCTL_OUT_OF_RESOURCES;
1493                         break;
1494
1495                 case -ENOSYS:
1496                 case -EINVAL:
1497                         ioctl->header.return_code = IOCTL_INVALID_PARAM;
1498                         break;
1499
1500                 default:
1501                         ioctl->header.return_code = IOCTL_GENERAL_ERROR;
1502                         break;
1503                 }
1504
1505         }
1506
1507         /* Always copy the buffer back, if only to pick up the status */
1508         err = copy_to_user(arg, ioctl, sizeof(struct atto_express_ioctl));
1509         if (err != 0) {
1510                 esas2r_log(ESAS2R_LOG_WARN,
1511                            "ioctl_handler copy_to_user didn't copy everything (err %d, cmd %u)",
1512                            err, cmd);
1513                 kfree(ioctl);
1514
1515                 return -EFAULT;
1516         }
1517
1518         kfree(ioctl);
1519
1520         return 0;
1521 }
1522
1523 int esas2r_ioctl(struct scsi_device *sd, unsigned int cmd, void __user *arg)
1524 {
1525         return esas2r_ioctl_handler(sd->host->hostdata, cmd, arg);
1526 }
1527
1528 static void free_fw_buffers(struct esas2r_adapter *a)
1529 {
1530         if (a->firmware.data) {
1531                 dma_free_coherent(&a->pcid->dev,
1532                                   (size_t)a->firmware.orig_len,
1533                                   a->firmware.data,
1534                                   (dma_addr_t)a->firmware.phys);
1535
1536                 a->firmware.data = NULL;
1537         }
1538 }
1539
1540 static int allocate_fw_buffers(struct esas2r_adapter *a, u32 length)
1541 {
1542         free_fw_buffers(a);
1543
1544         a->firmware.orig_len = length;
1545
1546         a->firmware.data = dma_alloc_coherent(&a->pcid->dev,
1547                                               (size_t)length,
1548                                               (dma_addr_t *)&a->firmware.phys,
1549                                               GFP_KERNEL);
1550
1551         if (!a->firmware.data) {
1552                 esas2r_debug("buffer alloc failed!");
1553                 return 0;
1554         }
1555
1556         return 1;
1557 }
1558
1559 /* Handle a call to read firmware. */
1560 int esas2r_read_fw(struct esas2r_adapter *a, char *buf, long off, int count)
1561 {
1562         esas2r_trace_enter();
1563         /* if the cached header is a status, simply copy it over and return. */
1564         if (a->firmware.state == FW_STATUS_ST) {
1565                 int size = min_t(int, count, sizeof(a->firmware.header));
1566                 esas2r_trace_exit();
1567                 memcpy(buf, &a->firmware.header, size);
1568                 esas2r_debug("esas2r_read_fw: STATUS size %d", size);
1569                 return size;
1570         }
1571
1572         /*
1573          * if the cached header is a command, do it if at
1574          * offset 0, otherwise copy the pieces.
1575          */
1576
1577         if (a->firmware.state == FW_COMMAND_ST) {
1578                 u32 length = a->firmware.header.length;
1579                 esas2r_trace_exit();
1580
1581                 esas2r_debug("esas2r_read_fw: COMMAND length %d off %d",
1582                              length,
1583                              off);
1584
1585                 if (off == 0) {
1586                         if (a->firmware.header.action == FI_ACT_UP) {
1587                                 if (!allocate_fw_buffers(a, length))
1588                                         return -ENOMEM;
1589
1590
1591                                 /* copy header over */
1592
1593                                 memcpy(a->firmware.data,
1594                                        &a->firmware.header,
1595                                        sizeof(a->firmware.header));
1596
1597                                 do_fm_api(a,
1598                                           (struct esas2r_flash_img *)a->firmware.data);
1599                         } else if (a->firmware.header.action == FI_ACT_UPSZ) {
1600                                 int size =
1601                                         min((int)count,
1602                                             (int)sizeof(a->firmware.header));
1603                                 do_fm_api(a, &a->firmware.header);
1604                                 memcpy(buf, &a->firmware.header, size);
1605                                 esas2r_debug("FI_ACT_UPSZ size %d", size);
1606                                 return size;
1607                         } else {
1608                                 esas2r_debug("invalid action %d",
1609                                              a->firmware.header.action);
1610                                 return -ENOSYS;
1611                         }
1612                 }
1613
1614                 if (count + off > length)
1615                         count = length - off;
1616
1617                 if (count < 0)
1618                         return 0;
1619
1620                 if (!a->firmware.data) {
1621                         esas2r_debug(
1622                                 "read: nonzero offset but no buffer available!");
1623                         return -ENOMEM;
1624                 }
1625
1626                 esas2r_debug("esas2r_read_fw: off %d count %d length %d ", off,
1627                              count,
1628                              length);
1629
1630                 memcpy(buf, &a->firmware.data[off], count);
1631
1632                 /* when done, release the buffer */
1633
1634                 if (length <= off + count) {
1635                         esas2r_debug("esas2r_read_fw: freeing buffer!");
1636
1637                         free_fw_buffers(a);
1638                 }
1639
1640                 return count;
1641         }
1642
1643         esas2r_trace_exit();
1644         esas2r_debug("esas2r_read_fw: invalid firmware state %d",
1645                      a->firmware.state);
1646
1647         return -EINVAL;
1648 }
1649
1650 /* Handle a call to write firmware. */
1651 int esas2r_write_fw(struct esas2r_adapter *a, const char *buf, long off,
1652                     int count)
1653 {
1654         u32 length;
1655
1656         if (off == 0) {
1657                 struct esas2r_flash_img *header =
1658                         (struct esas2r_flash_img *)buf;
1659
1660                 /* assume version 0 flash image */
1661
1662                 int min_size = sizeof(struct esas2r_flash_img_v0);
1663
1664                 a->firmware.state = FW_INVALID_ST;
1665
1666                 /* validate the version field first */
1667
1668                 if (count < 4
1669                     ||  header->fi_version > FI_VERSION_1) {
1670                         esas2r_debug(
1671                                 "esas2r_write_fw: short header or invalid version");
1672                         return -EINVAL;
1673                 }
1674
1675                 /* See if its a version 1 flash image */
1676
1677                 if (header->fi_version == FI_VERSION_1)
1678                         min_size = sizeof(struct esas2r_flash_img);
1679
1680                 /* If this is the start, the header must be full and valid. */
1681                 if (count < min_size) {
1682                         esas2r_debug("esas2r_write_fw: short header, aborting");
1683                         return -EINVAL;
1684                 }
1685
1686                 /* Make sure the size is reasonable. */
1687                 length = header->length;
1688
1689                 if (length > 1024 * 1024) {
1690                         esas2r_debug(
1691                                 "esas2r_write_fw: hosed, length %d  fi_version %d",
1692                                 length, header->fi_version);
1693                         return -EINVAL;
1694                 }
1695
1696                 /*
1697                  * If this is a write command, allocate memory because
1698                  * we have to cache everything. otherwise, just cache
1699                  * the header, because the read op will do the command.
1700                  */
1701
1702                 if (header->action == FI_ACT_DOWN) {
1703                         if (!allocate_fw_buffers(a, length))
1704                                 return -ENOMEM;
1705
1706                         /*
1707                          * Store the command, so there is context on subsequent
1708                          * calls.
1709                          */
1710                         memcpy(&a->firmware.header,
1711                                buf,
1712                                sizeof(*header));
1713                 } else if (header->action == FI_ACT_UP
1714                            ||  header->action == FI_ACT_UPSZ) {
1715                         /* Save the command, result will be picked up on read */
1716                         memcpy(&a->firmware.header,
1717                                buf,
1718                                sizeof(*header));
1719
1720                         a->firmware.state = FW_COMMAND_ST;
1721
1722                         esas2r_debug(
1723                                 "esas2r_write_fw: COMMAND, count %d, action %d ",
1724                                 count, header->action);
1725
1726                         /*
1727                          * Pretend we took the whole buffer,
1728                          * so we don't get bothered again.
1729                          */
1730
1731                         return count;
1732                 } else {
1733                         esas2r_debug("esas2r_write_fw: invalid action %d ",
1734                                      a->firmware.header.action);
1735                         return -ENOSYS;
1736                 }
1737         } else {
1738                 length = a->firmware.header.length;
1739         }
1740
1741         /*
1742          * We only get here on a download command, regardless of offset.
1743          * the chunks written by the system need to be cached, and when
1744          * the final one arrives, issue the fmapi command.
1745          */
1746
1747         if (off + count > length)
1748                 count = length - off;
1749
1750         if (count > 0) {
1751                 esas2r_debug("esas2r_write_fw: off %d count %d length %d", off,
1752                              count,
1753                              length);
1754
1755                 /*
1756                  * On a full upload, the system tries sending the whole buffer.
1757                  * there's nothing to do with it, so just drop it here, before
1758                  * trying to copy over into unallocated memory!
1759                  */
1760                 if (a->firmware.header.action == FI_ACT_UP)
1761                         return count;
1762
1763                 if (!a->firmware.data) {
1764                         esas2r_debug(
1765                                 "write: nonzero offset but no buffer available!");
1766                         return -ENOMEM;
1767                 }
1768
1769                 memcpy(&a->firmware.data[off], buf, count);
1770
1771                 if (length == off + count) {
1772                         do_fm_api(a,
1773                                   (struct esas2r_flash_img *)a->firmware.data);
1774
1775                         /*
1776                          * Now copy the header result to be picked up by the
1777                          * next read
1778                          */
1779                         memcpy(&a->firmware.header,
1780                                a->firmware.data,
1781                                sizeof(a->firmware.header));
1782
1783                         a->firmware.state = FW_STATUS_ST;
1784
1785                         esas2r_debug("write completed");
1786
1787                         /*
1788                          * Since the system has the data buffered, the only way
1789                          * this can leak is if a root user writes a program
1790                          * that writes a shorter buffer than it claims, and the
1791                          * copyin fails.
1792                          */
1793                         free_fw_buffers(a);
1794                 }
1795         }
1796
1797         return count;
1798 }
1799
1800 /* Callback for the completion of a VDA request. */
1801 static void vda_complete_req(struct esas2r_adapter *a,
1802                              struct esas2r_request *rq)
1803 {
1804         a->vda_command_done = 1;
1805         wake_up_interruptible(&a->vda_waiter);
1806 }
1807
1808 /* Scatter/gather callback for VDA requests */
1809 static u32 get_physaddr_vda(struct esas2r_sg_context *sgc, u64 *addr)
1810 {
1811         struct esas2r_adapter *a = (struct esas2r_adapter *)sgc->adapter;
1812         int offset = (u8 *)sgc->cur_offset - (u8 *)a->vda_buffer;
1813
1814         (*addr) = a->ppvda_buffer + offset;
1815         return VDA_MAX_BUFFER_SIZE - offset;
1816 }
1817
1818 /* Handle a call to read a VDA command. */
1819 int esas2r_read_vda(struct esas2r_adapter *a, char *buf, long off, int count)
1820 {
1821         if (!a->vda_buffer)
1822                 return -ENOMEM;
1823
1824         if (off == 0) {
1825                 struct esas2r_request *rq;
1826                 struct atto_ioctl_vda *vi =
1827                         (struct atto_ioctl_vda *)a->vda_buffer;
1828                 struct esas2r_sg_context sgc;
1829                 bool wait_for_completion;
1830
1831                 /*
1832                  * Presumeably, someone has already written to the vda_buffer,
1833                  * and now they are reading the node the response, so now we
1834                  * will actually issue the request to the chip and reply.
1835                  */
1836
1837                 /* allocate a request */
1838                 rq = esas2r_alloc_request(a);
1839                 if (rq == NULL) {
1840                         esas2r_debug("esas2r_read_vda: out of requests");
1841                         return -EBUSY;
1842                 }
1843
1844                 rq->comp_cb = vda_complete_req;
1845
1846                 sgc.first_req = rq;
1847                 sgc.adapter = a;
1848                 sgc.cur_offset = a->vda_buffer + VDA_BUFFER_HEADER_SZ;
1849                 sgc.get_phys_addr = (PGETPHYSADDR)get_physaddr_vda;
1850
1851                 a->vda_command_done = 0;
1852
1853                 wait_for_completion =
1854                         esas2r_process_vda_ioctl(a, vi, rq, &sgc);
1855
1856                 if (wait_for_completion) {
1857                         /* now wait around for it to complete. */
1858
1859                         while (!a->vda_command_done)
1860                                 wait_event_interruptible(a->vda_waiter,
1861                                                          a->vda_command_done);
1862                 }
1863
1864                 esas2r_free_request(a, (struct esas2r_request *)rq);
1865         }
1866
1867         if (off > VDA_MAX_BUFFER_SIZE)
1868                 return 0;
1869
1870         if (count + off > VDA_MAX_BUFFER_SIZE)
1871                 count = VDA_MAX_BUFFER_SIZE - off;
1872
1873         if (count < 0)
1874                 return 0;
1875
1876         memcpy(buf, a->vda_buffer + off, count);
1877
1878         return count;
1879 }
1880
1881 /* Handle a call to write a VDA command. */
1882 int esas2r_write_vda(struct esas2r_adapter *a, const char *buf, long off,
1883                      int count)
1884 {
1885         /*
1886          * allocate memory for it, if not already done.  once allocated,
1887          * we will keep it around until the driver is unloaded.
1888          */
1889
1890         if (!a->vda_buffer) {
1891                 dma_addr_t dma_addr;
1892                 a->vda_buffer = dma_alloc_coherent(&a->pcid->dev,
1893                                                    (size_t)
1894                                                    VDA_MAX_BUFFER_SIZE,
1895                                                    &dma_addr,
1896                                                    GFP_KERNEL);
1897
1898                 a->ppvda_buffer = dma_addr;
1899         }
1900
1901         if (!a->vda_buffer)
1902                 return -ENOMEM;
1903
1904         if (off > VDA_MAX_BUFFER_SIZE)
1905                 return 0;
1906
1907         if (count + off > VDA_MAX_BUFFER_SIZE)
1908                 count = VDA_MAX_BUFFER_SIZE - off;
1909
1910         if (count < 1)
1911                 return 0;
1912
1913         memcpy(a->vda_buffer + off, buf, count);
1914
1915         return count;
1916 }
1917
1918 /* Callback for the completion of an FS_API request.*/
1919 static void fs_api_complete_req(struct esas2r_adapter *a,
1920                                 struct esas2r_request *rq)
1921 {
1922         a->fs_api_command_done = 1;
1923
1924         wake_up_interruptible(&a->fs_api_waiter);
1925 }
1926
1927 /* Scatter/gather callback for VDA requests */
1928 static u32 get_physaddr_fs_api(struct esas2r_sg_context *sgc, u64 *addr)
1929 {
1930         struct esas2r_adapter *a = (struct esas2r_adapter *)sgc->adapter;
1931         struct esas2r_ioctl_fs *fs =
1932                 (struct esas2r_ioctl_fs *)a->fs_api_buffer;
1933         u32 offset = (u8 *)sgc->cur_offset - (u8 *)fs;
1934
1935         (*addr) = a->ppfs_api_buffer + offset;
1936
1937         return a->fs_api_buffer_size - offset;
1938 }
1939
1940 /* Handle a call to read firmware via FS_API. */
1941 int esas2r_read_fs(struct esas2r_adapter *a, char *buf, long off, int count)
1942 {
1943         if (!a->fs_api_buffer)
1944                 return -ENOMEM;
1945
1946         if (off == 0) {
1947                 struct esas2r_request *rq;
1948                 struct esas2r_sg_context sgc;
1949                 struct esas2r_ioctl_fs *fs =
1950                         (struct esas2r_ioctl_fs *)a->fs_api_buffer;
1951
1952                 /* If another flash request is already in progress, return. */
1953                 if (mutex_lock_interruptible(&a->fs_api_mutex)) {
1954 busy:
1955                         fs->status = ATTO_STS_OUT_OF_RSRC;
1956                         return -EBUSY;
1957                 }
1958
1959                 /*
1960                  * Presumeably, someone has already written to the
1961                  * fs_api_buffer, and now they are reading the node the
1962                  * response, so now we will actually issue the request to the
1963                  * chip and reply. Allocate a request
1964                  */
1965
1966                 rq = esas2r_alloc_request(a);
1967                 if (rq == NULL) {
1968                         esas2r_debug("esas2r_read_fs: out of requests");
1969                         mutex_unlock(&a->fs_api_mutex);
1970                         goto busy;
1971                 }
1972
1973                 rq->comp_cb = fs_api_complete_req;
1974
1975                 /* Set up the SGCONTEXT for to build the s/g table */
1976
1977                 sgc.cur_offset = fs->data;
1978                 sgc.get_phys_addr = (PGETPHYSADDR)get_physaddr_fs_api;
1979
1980                 a->fs_api_command_done = 0;
1981
1982                 if (!esas2r_process_fs_ioctl(a, fs, rq, &sgc)) {
1983                         if (fs->status == ATTO_STS_OUT_OF_RSRC)
1984                                 count = -EBUSY;
1985
1986                         goto dont_wait;
1987                 }
1988
1989                 /* Now wait around for it to complete. */
1990
1991                 while (!a->fs_api_command_done)
1992                         wait_event_interruptible(a->fs_api_waiter,
1993                                                  a->fs_api_command_done);
1994                 ;
1995 dont_wait:
1996                 /* Free the request and keep going */
1997                 mutex_unlock(&a->fs_api_mutex);
1998                 esas2r_free_request(a, (struct esas2r_request *)rq);
1999
2000                 /* Pick up possible error code from above */
2001                 if (count < 0)
2002                         return count;
2003         }
2004
2005         if (off > a->fs_api_buffer_size)
2006                 return 0;
2007
2008         if (count + off > a->fs_api_buffer_size)
2009                 count = a->fs_api_buffer_size - off;
2010
2011         if (count < 0)
2012                 return 0;
2013
2014         memcpy(buf, a->fs_api_buffer + off, count);
2015
2016         return count;
2017 }
2018
2019 /* Handle a call to write firmware via FS_API. */
2020 int esas2r_write_fs(struct esas2r_adapter *a, const char *buf, long off,
2021                     int count)
2022 {
2023         if (off == 0) {
2024                 struct esas2r_ioctl_fs *fs = (struct esas2r_ioctl_fs *)buf;
2025                 u32 length = fs->command.length + offsetof(
2026                         struct esas2r_ioctl_fs,
2027                         data);
2028
2029                 /*
2030                  * Special case, for BEGIN commands, the length field
2031                  * is lying to us, so just get enough for the header.
2032                  */
2033
2034                 if (fs->command.command == ESAS2R_FS_CMD_BEGINW)
2035                         length = offsetof(struct esas2r_ioctl_fs, data);
2036
2037                 /*
2038                  * Beginning a command.  We assume we'll get at least
2039                  * enough in the first write so we can look at the
2040                  * header and see how much we need to alloc.
2041                  */
2042
2043                 if (count < offsetof(struct esas2r_ioctl_fs, data))
2044                         return -EINVAL;
2045
2046                 /* Allocate a buffer or use the existing buffer. */
2047                 if (a->fs_api_buffer) {
2048                         if (a->fs_api_buffer_size < length) {
2049                                 /* Free too-small buffer and get a new one */
2050                                 dma_free_coherent(&a->pcid->dev,
2051                                                   (size_t)a->fs_api_buffer_size,
2052                                                   a->fs_api_buffer,
2053                                                   (dma_addr_t)a->ppfs_api_buffer);
2054
2055                                 goto re_allocate_buffer;
2056                         }
2057                 } else {
2058 re_allocate_buffer:
2059                         a->fs_api_buffer_size = length;
2060
2061                         a->fs_api_buffer = dma_alloc_coherent(&a->pcid->dev,
2062                                                               (size_t)a->fs_api_buffer_size,
2063                                                               (dma_addr_t *)&a->ppfs_api_buffer,
2064                                                               GFP_KERNEL);
2065                 }
2066         }
2067
2068         if (!a->fs_api_buffer)
2069                 return -ENOMEM;
2070
2071         if (off > a->fs_api_buffer_size)
2072                 return 0;
2073
2074         if (count + off > a->fs_api_buffer_size)
2075                 count = a->fs_api_buffer_size - off;
2076
2077         if (count < 1)
2078                 return 0;
2079
2080         memcpy(a->fs_api_buffer + off, buf, count);
2081
2082         return count;
2083 }