blob: 542ed88ef90d838b8d58d6631c1117268c9a5c5c [file] [log] [blame]
Hannes Reinecke081ff392018-10-17 17:25:11 +02001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
4 *
5 * Copyright 2017 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
6 *
7 * Based on the original DAC960 driver,
8 * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
9 * Portions Copyright 2002 by Mylex (An IBM Business Unit)
10 *
11 */
12
13#include <linux/module.h>
14#include <linux/types.h>
15#include <linux/delay.h>
16#include <linux/interrupt.h>
17#include <linux/pci.h>
18#include <linux/raid_class.h>
19#include <asm/unaligned.h>
20#include <scsi/scsi.h>
21#include <scsi/scsi_host.h>
22#include <scsi/scsi_device.h>
23#include <scsi/scsi_cmnd.h>
24#include <scsi/scsi_tcq.h>
25#include "myrb.h"
26
27static struct raid_template *myrb_raid_template;
28
29static void myrb_monitor(struct work_struct *work);
30static inline void myrb_translate_devstate(void *DeviceState);
31
32static inline int myrb_logical_channel(struct Scsi_Host *shost)
33{
34 return shost->max_channel - 1;
35}
36
37static struct myrb_devstate_name_entry {
38 enum myrb_devstate state;
39 const char *name;
40} myrb_devstate_name_list[] = {
41 { MYRB_DEVICE_DEAD, "Dead" },
42 { MYRB_DEVICE_WO, "WriteOnly" },
43 { MYRB_DEVICE_ONLINE, "Online" },
44 { MYRB_DEVICE_CRITICAL, "Critical" },
45 { MYRB_DEVICE_STANDBY, "Standby" },
46 { MYRB_DEVICE_OFFLINE, "Offline" },
47};
48
49static const char *myrb_devstate_name(enum myrb_devstate state)
50{
51 struct myrb_devstate_name_entry *entry = myrb_devstate_name_list;
52 int i;
53
54 for (i = 0; i < ARRAY_SIZE(myrb_devstate_name_list); i++) {
55 if (entry[i].state == state)
56 return entry[i].name;
57 }
58 return "Unknown";
59}
60
61static struct myrb_raidlevel_name_entry {
62 enum myrb_raidlevel level;
63 const char *name;
64} myrb_raidlevel_name_list[] = {
65 { MYRB_RAID_LEVEL0, "RAID0" },
66 { MYRB_RAID_LEVEL1, "RAID1" },
67 { MYRB_RAID_LEVEL3, "RAID3" },
68 { MYRB_RAID_LEVEL5, "RAID5" },
69 { MYRB_RAID_LEVEL6, "RAID6" },
70 { MYRB_RAID_JBOD, "JBOD" },
71};
72
73static const char *myrb_raidlevel_name(enum myrb_raidlevel level)
74{
75 struct myrb_raidlevel_name_entry *entry = myrb_raidlevel_name_list;
76 int i;
77
78 for (i = 0; i < ARRAY_SIZE(myrb_raidlevel_name_list); i++) {
79 if (entry[i].level == level)
80 return entry[i].name;
81 }
82 return NULL;
83}
84
Lee Jones12a1b742021-03-17 09:11:55 +000085/*
Hannes Reinecke081ff392018-10-17 17:25:11 +020086 * myrb_create_mempools - allocates auxiliary data structures
87 *
88 * Return: true on success, false otherwise.
89 */
90static bool myrb_create_mempools(struct pci_dev *pdev, struct myrb_hba *cb)
91{
92 size_t elem_size, elem_align;
93
94 elem_align = sizeof(struct myrb_sge);
95 elem_size = cb->host->sg_tablesize * elem_align;
96 cb->sg_pool = dma_pool_create("myrb_sg", &pdev->dev,
97 elem_size, elem_align, 0);
98 if (cb->sg_pool == NULL) {
99 shost_printk(KERN_ERR, cb->host,
100 "Failed to allocate SG pool\n");
101 return false;
102 }
103
104 cb->dcdb_pool = dma_pool_create("myrb_dcdb", &pdev->dev,
105 sizeof(struct myrb_dcdb),
106 sizeof(unsigned int), 0);
107 if (!cb->dcdb_pool) {
108 dma_pool_destroy(cb->sg_pool);
109 cb->sg_pool = NULL;
110 shost_printk(KERN_ERR, cb->host,
111 "Failed to allocate DCDB pool\n");
112 return false;
113 }
114
115 snprintf(cb->work_q_name, sizeof(cb->work_q_name),
116 "myrb_wq_%d", cb->host->host_no);
117 cb->work_q = create_singlethread_workqueue(cb->work_q_name);
118 if (!cb->work_q) {
119 dma_pool_destroy(cb->dcdb_pool);
120 cb->dcdb_pool = NULL;
121 dma_pool_destroy(cb->sg_pool);
122 cb->sg_pool = NULL;
123 shost_printk(KERN_ERR, cb->host,
124 "Failed to create workqueue\n");
125 return false;
126 }
127
128 /*
129 * Initialize the Monitoring Timer.
130 */
131 INIT_DELAYED_WORK(&cb->monitor_work, myrb_monitor);
132 queue_delayed_work(cb->work_q, &cb->monitor_work, 1);
133
134 return true;
135}
136
Lee Jones12a1b742021-03-17 09:11:55 +0000137/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200138 * myrb_destroy_mempools - tears down the memory pools for the controller
139 */
140static void myrb_destroy_mempools(struct myrb_hba *cb)
141{
142 cancel_delayed_work_sync(&cb->monitor_work);
143 destroy_workqueue(cb->work_q);
144
145 dma_pool_destroy(cb->sg_pool);
146 dma_pool_destroy(cb->dcdb_pool);
147}
148
Lee Jones12a1b742021-03-17 09:11:55 +0000149/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200150 * myrb_reset_cmd - reset command block
151 */
152static inline void myrb_reset_cmd(struct myrb_cmdblk *cmd_blk)
153{
154 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
155
156 memset(mbox, 0, sizeof(union myrb_cmd_mbox));
157 cmd_blk->status = 0;
158}
159
Lee Jones12a1b742021-03-17 09:11:55 +0000160/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200161 * myrb_qcmd - queues command block for execution
162 */
163static void myrb_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
164{
165 void __iomem *base = cb->io_base;
166 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
167 union myrb_cmd_mbox *next_mbox = cb->next_cmd_mbox;
168
169 cb->write_cmd_mbox(next_mbox, mbox);
170 if (cb->prev_cmd_mbox1->words[0] == 0 ||
171 cb->prev_cmd_mbox2->words[0] == 0)
172 cb->get_cmd_mbox(base);
173 cb->prev_cmd_mbox2 = cb->prev_cmd_mbox1;
174 cb->prev_cmd_mbox1 = next_mbox;
175 if (++next_mbox > cb->last_cmd_mbox)
176 next_mbox = cb->first_cmd_mbox;
177 cb->next_cmd_mbox = next_mbox;
178}
179
Lee Jones12a1b742021-03-17 09:11:55 +0000180/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200181 * myrb_exec_cmd - executes command block and waits for completion.
182 *
183 * Return: command status
184 */
185static unsigned short myrb_exec_cmd(struct myrb_hba *cb,
186 struct myrb_cmdblk *cmd_blk)
187{
188 DECLARE_COMPLETION_ONSTACK(cmpl);
189 unsigned long flags;
190
191 cmd_blk->completion = &cmpl;
192
193 spin_lock_irqsave(&cb->queue_lock, flags);
194 cb->qcmd(cb, cmd_blk);
195 spin_unlock_irqrestore(&cb->queue_lock, flags);
196
Hannes Reinecke081ff392018-10-17 17:25:11 +0200197 wait_for_completion(&cmpl);
198 return cmd_blk->status;
199}
200
Lee Jones12a1b742021-03-17 09:11:55 +0000201/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200202 * myrb_exec_type3 - executes a type 3 command and waits for completion.
203 *
204 * Return: command status
205 */
206static unsigned short myrb_exec_type3(struct myrb_hba *cb,
207 enum myrb_cmd_opcode op, dma_addr_t addr)
208{
209 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
210 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
211 unsigned short status;
212
213 mutex_lock(&cb->dcmd_mutex);
214 myrb_reset_cmd(cmd_blk);
215 mbox->type3.id = MYRB_DCMD_TAG;
216 mbox->type3.opcode = op;
217 mbox->type3.addr = addr;
218 status = myrb_exec_cmd(cb, cmd_blk);
219 mutex_unlock(&cb->dcmd_mutex);
220 return status;
221}
222
Lee Jones12a1b742021-03-17 09:11:55 +0000223/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200224 * myrb_exec_type3D - executes a type 3D command and waits for completion.
225 *
226 * Return: command status
227 */
228static unsigned short myrb_exec_type3D(struct myrb_hba *cb,
229 enum myrb_cmd_opcode op, struct scsi_device *sdev,
230 struct myrb_pdev_state *pdev_info)
231{
232 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
233 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
234 unsigned short status;
235 dma_addr_t pdev_info_addr;
236
237 pdev_info_addr = dma_map_single(&cb->pdev->dev, pdev_info,
238 sizeof(struct myrb_pdev_state),
239 DMA_FROM_DEVICE);
240 if (dma_mapping_error(&cb->pdev->dev, pdev_info_addr))
241 return MYRB_STATUS_SUBSYS_FAILED;
242
243 mutex_lock(&cb->dcmd_mutex);
244 myrb_reset_cmd(cmd_blk);
245 mbox->type3D.id = MYRB_DCMD_TAG;
246 mbox->type3D.opcode = op;
247 mbox->type3D.channel = sdev->channel;
248 mbox->type3D.target = sdev->id;
249 mbox->type3D.addr = pdev_info_addr;
250 status = myrb_exec_cmd(cb, cmd_blk);
251 mutex_unlock(&cb->dcmd_mutex);
252 dma_unmap_single(&cb->pdev->dev, pdev_info_addr,
253 sizeof(struct myrb_pdev_state), DMA_FROM_DEVICE);
254 if (status == MYRB_STATUS_SUCCESS &&
255 mbox->type3D.opcode == MYRB_CMD_GET_DEVICE_STATE_OLD)
256 myrb_translate_devstate(pdev_info);
257
258 return status;
259}
260
261static char *myrb_event_msg[] = {
262 "killed because write recovery failed",
263 "killed because of SCSI bus reset failure",
264 "killed because of double check condition",
265 "killed because it was removed",
266 "killed because of gross error on SCSI chip",
267 "killed because of bad tag returned from drive",
268 "killed because of timeout on SCSI command",
269 "killed because of reset SCSI command issued from system",
270 "killed because busy or parity error count exceeded limit",
271 "killed because of 'kill drive' command from system",
272 "killed because of selection timeout",
273 "killed due to SCSI phase sequence error",
274 "killed due to unknown status",
275};
276
277/**
278 * myrb_get_event - get event log from HBA
279 * @cb: pointer to the hba structure
280 * @event: number of the event
281 *
282 * Execute a type 3E command and logs the event message
283 */
284static void myrb_get_event(struct myrb_hba *cb, unsigned int event)
285{
286 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
287 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
288 struct myrb_log_entry *ev_buf;
289 dma_addr_t ev_addr;
290 unsigned short status;
291
292 ev_buf = dma_alloc_coherent(&cb->pdev->dev,
293 sizeof(struct myrb_log_entry),
294 &ev_addr, GFP_KERNEL);
295 if (!ev_buf)
296 return;
297
298 myrb_reset_cmd(cmd_blk);
299 mbox->type3E.id = MYRB_MCMD_TAG;
300 mbox->type3E.opcode = MYRB_CMD_EVENT_LOG_OPERATION;
301 mbox->type3E.optype = DAC960_V1_GetEventLogEntry;
302 mbox->type3E.opqual = 1;
303 mbox->type3E.ev_seq = event;
304 mbox->type3E.addr = ev_addr;
305 status = myrb_exec_cmd(cb, cmd_blk);
306 if (status != MYRB_STATUS_SUCCESS)
307 shost_printk(KERN_INFO, cb->host,
308 "Failed to get event log %d, status %04x\n",
309 event, status);
310
311 else if (ev_buf->seq_num == event) {
312 struct scsi_sense_hdr sshdr;
313
314 memset(&sshdr, 0, sizeof(sshdr));
315 scsi_normalize_sense(ev_buf->sense, 32, &sshdr);
316
317 if (sshdr.sense_key == VENDOR_SPECIFIC &&
318 sshdr.asc == 0x80 &&
319 sshdr.ascq < ARRAY_SIZE(myrb_event_msg))
320 shost_printk(KERN_CRIT, cb->host,
321 "Physical drive %d:%d: %s\n",
322 ev_buf->channel, ev_buf->target,
323 myrb_event_msg[sshdr.ascq]);
324 else
325 shost_printk(KERN_CRIT, cb->host,
326 "Physical drive %d:%d: Sense: %X/%02X/%02X\n",
327 ev_buf->channel, ev_buf->target,
328 sshdr.sense_key, sshdr.asc, sshdr.ascq);
329 }
330
331 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_log_entry),
332 ev_buf, ev_addr);
333}
334
Lee Jones12a1b742021-03-17 09:11:55 +0000335/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200336 * myrb_get_errtable - retrieves the error table from the controller
337 *
338 * Executes a type 3 command and logs the error table from the controller.
339 */
340static void myrb_get_errtable(struct myrb_hba *cb)
341{
342 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
343 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
344 unsigned short status;
345 struct myrb_error_entry old_table[MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS];
346
347 memcpy(&old_table, cb->err_table, sizeof(old_table));
348
349 myrb_reset_cmd(cmd_blk);
350 mbox->type3.id = MYRB_MCMD_TAG;
351 mbox->type3.opcode = MYRB_CMD_GET_ERROR_TABLE;
352 mbox->type3.addr = cb->err_table_addr;
353 status = myrb_exec_cmd(cb, cmd_blk);
354 if (status == MYRB_STATUS_SUCCESS) {
355 struct myrb_error_entry *table = cb->err_table;
356 struct myrb_error_entry *new, *old;
357 size_t err_table_offset;
358 struct scsi_device *sdev;
359
360 shost_for_each_device(sdev, cb->host) {
361 if (sdev->channel >= myrb_logical_channel(cb->host))
362 continue;
363 err_table_offset = sdev->channel * MYRB_MAX_TARGETS
364 + sdev->id;
365 new = table + err_table_offset;
366 old = &old_table[err_table_offset];
367 if (new->parity_err == old->parity_err &&
368 new->soft_err == old->soft_err &&
369 new->hard_err == old->hard_err &&
370 new->misc_err == old->misc_err)
371 continue;
372 sdev_printk(KERN_CRIT, sdev,
373 "Errors: Parity = %d, Soft = %d, Hard = %d, Misc = %d\n",
374 new->parity_err, new->soft_err,
375 new->hard_err, new->misc_err);
376 }
377 }
378}
379
Lee Jones12a1b742021-03-17 09:11:55 +0000380/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200381 * myrb_get_ldev_info - retrieves the logical device table from the controller
382 *
383 * Executes a type 3 command and updates the logical device table.
384 *
385 * Return: command status
386 */
387static unsigned short myrb_get_ldev_info(struct myrb_hba *cb)
388{
389 unsigned short status;
390 int ldev_num, ldev_cnt = cb->enquiry->ldev_count;
391 struct Scsi_Host *shost = cb->host;
392
393 status = myrb_exec_type3(cb, MYRB_CMD_GET_LDEV_INFO,
394 cb->ldev_info_addr);
395 if (status != MYRB_STATUS_SUCCESS)
396 return status;
397
398 for (ldev_num = 0; ldev_num < ldev_cnt; ldev_num++) {
399 struct myrb_ldev_info *old = NULL;
400 struct myrb_ldev_info *new = cb->ldev_info_buf + ldev_num;
401 struct scsi_device *sdev;
402
403 sdev = scsi_device_lookup(shost, myrb_logical_channel(shost),
404 ldev_num, 0);
405 if (!sdev) {
406 if (new->state == MYRB_DEVICE_OFFLINE)
407 continue;
408 shost_printk(KERN_INFO, shost,
409 "Adding Logical Drive %d in state %s\n",
410 ldev_num, myrb_devstate_name(new->state));
411 scsi_add_device(shost, myrb_logical_channel(shost),
412 ldev_num, 0);
413 continue;
414 }
415 old = sdev->hostdata;
416 if (new->state != old->state)
417 shost_printk(KERN_INFO, shost,
418 "Logical Drive %d is now %s\n",
419 ldev_num, myrb_devstate_name(new->state));
420 if (new->wb_enabled != old->wb_enabled)
421 sdev_printk(KERN_INFO, sdev,
422 "Logical Drive is now WRITE %s\n",
423 (new->wb_enabled ? "BACK" : "THRU"));
424 memcpy(old, new, sizeof(*new));
425 scsi_device_put(sdev);
426 }
427 return status;
428}
429
Lee Jones12a1b742021-03-17 09:11:55 +0000430/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200431 * myrb_get_rbld_progress - get rebuild progress information
432 *
433 * Executes a type 3 command and returns the rebuild progress
434 * information.
435 *
436 * Return: command status
437 */
438static unsigned short myrb_get_rbld_progress(struct myrb_hba *cb,
439 struct myrb_rbld_progress *rbld)
440{
441 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
442 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
443 struct myrb_rbld_progress *rbld_buf;
444 dma_addr_t rbld_addr;
445 unsigned short status;
446
447 rbld_buf = dma_alloc_coherent(&cb->pdev->dev,
448 sizeof(struct myrb_rbld_progress),
449 &rbld_addr, GFP_KERNEL);
450 if (!rbld_buf)
451 return MYRB_STATUS_RBLD_NOT_CHECKED;
452
453 myrb_reset_cmd(cmd_blk);
454 mbox->type3.id = MYRB_MCMD_TAG;
455 mbox->type3.opcode = MYRB_CMD_GET_REBUILD_PROGRESS;
456 mbox->type3.addr = rbld_addr;
457 status = myrb_exec_cmd(cb, cmd_blk);
458 if (rbld)
459 memcpy(rbld, rbld_buf, sizeof(struct myrb_rbld_progress));
460 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress),
461 rbld_buf, rbld_addr);
462 return status;
463}
464
Lee Jones12a1b742021-03-17 09:11:55 +0000465/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200466 * myrb_update_rbld_progress - updates the rebuild status
467 *
468 * Updates the rebuild status for the attached logical devices.
Hannes Reinecke081ff392018-10-17 17:25:11 +0200469 */
470static void myrb_update_rbld_progress(struct myrb_hba *cb)
471{
472 struct myrb_rbld_progress rbld_buf;
473 unsigned short status;
474
475 status = myrb_get_rbld_progress(cb, &rbld_buf);
476 if (status == MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS &&
477 cb->last_rbld_status == MYRB_STATUS_SUCCESS)
478 status = MYRB_STATUS_RBLD_SUCCESS;
479 if (status != MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS) {
480 unsigned int blocks_done =
481 rbld_buf.ldev_size - rbld_buf.blocks_left;
482 struct scsi_device *sdev;
483
484 sdev = scsi_device_lookup(cb->host,
485 myrb_logical_channel(cb->host),
486 rbld_buf.ldev_num, 0);
487 if (!sdev)
488 return;
489
490 switch (status) {
491 case MYRB_STATUS_SUCCESS:
492 sdev_printk(KERN_INFO, sdev,
493 "Rebuild in Progress, %d%% completed\n",
494 (100 * (blocks_done >> 7))
495 / (rbld_buf.ldev_size >> 7));
496 break;
497 case MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE:
498 sdev_printk(KERN_INFO, sdev,
499 "Rebuild Failed due to Logical Drive Failure\n");
500 break;
501 case MYRB_STATUS_RBLD_FAILED_BADBLOCKS:
502 sdev_printk(KERN_INFO, sdev,
503 "Rebuild Failed due to Bad Blocks on Other Drives\n");
504 break;
505 case MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED:
506 sdev_printk(KERN_INFO, sdev,
507 "Rebuild Failed due to Failure of Drive Being Rebuilt\n");
508 break;
509 case MYRB_STATUS_RBLD_SUCCESS:
510 sdev_printk(KERN_INFO, sdev,
511 "Rebuild Completed Successfully\n");
512 break;
513 case MYRB_STATUS_RBLD_SUCCESS_TERMINATED:
514 sdev_printk(KERN_INFO, sdev,
515 "Rebuild Successfully Terminated\n");
516 break;
517 default:
518 break;
519 }
520 scsi_device_put(sdev);
521 }
522 cb->last_rbld_status = status;
523}
524
Lee Jones12a1b742021-03-17 09:11:55 +0000525/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200526 * myrb_get_cc_progress - retrieve the rebuild status
527 *
528 * Execute a type 3 Command and fetch the rebuild / consistency check
529 * status.
530 */
531static void myrb_get_cc_progress(struct myrb_hba *cb)
532{
533 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
534 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
535 struct myrb_rbld_progress *rbld_buf;
536 dma_addr_t rbld_addr;
537 unsigned short status;
538
539 rbld_buf = dma_alloc_coherent(&cb->pdev->dev,
540 sizeof(struct myrb_rbld_progress),
541 &rbld_addr, GFP_KERNEL);
542 if (!rbld_buf) {
543 cb->need_cc_status = true;
544 return;
545 }
546 myrb_reset_cmd(cmd_blk);
547 mbox->type3.id = MYRB_MCMD_TAG;
548 mbox->type3.opcode = MYRB_CMD_REBUILD_STAT;
549 mbox->type3.addr = rbld_addr;
550 status = myrb_exec_cmd(cb, cmd_blk);
551 if (status == MYRB_STATUS_SUCCESS) {
552 unsigned int ldev_num = rbld_buf->ldev_num;
553 unsigned int ldev_size = rbld_buf->ldev_size;
554 unsigned int blocks_done =
555 ldev_size - rbld_buf->blocks_left;
556 struct scsi_device *sdev;
557
558 sdev = scsi_device_lookup(cb->host,
559 myrb_logical_channel(cb->host),
560 ldev_num, 0);
561 if (sdev) {
562 sdev_printk(KERN_INFO, sdev,
563 "Consistency Check in Progress: %d%% completed\n",
564 (100 * (blocks_done >> 7))
565 / (ldev_size >> 7));
566 scsi_device_put(sdev);
567 }
568 }
569 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress),
570 rbld_buf, rbld_addr);
571}
572
Lee Jones12a1b742021-03-17 09:11:55 +0000573/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200574 * myrb_bgi_control - updates background initialisation status
575 *
576 * Executes a type 3B command and updates the background initialisation status
577 */
578static void myrb_bgi_control(struct myrb_hba *cb)
579{
580 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
581 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
582 struct myrb_bgi_status *bgi, *last_bgi;
583 dma_addr_t bgi_addr;
584 struct scsi_device *sdev = NULL;
585 unsigned short status;
586
587 bgi = dma_alloc_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status),
588 &bgi_addr, GFP_KERNEL);
589 if (!bgi) {
590 shost_printk(KERN_ERR, cb->host,
591 "Failed to allocate bgi memory\n");
592 return;
593 }
594 myrb_reset_cmd(cmd_blk);
595 mbox->type3B.id = MYRB_DCMD_TAG;
596 mbox->type3B.opcode = MYRB_CMD_BGI_CONTROL;
597 mbox->type3B.optype = 0x20;
598 mbox->type3B.addr = bgi_addr;
599 status = myrb_exec_cmd(cb, cmd_blk);
600 last_bgi = &cb->bgi_status;
601 sdev = scsi_device_lookup(cb->host,
602 myrb_logical_channel(cb->host),
603 bgi->ldev_num, 0);
604 switch (status) {
605 case MYRB_STATUS_SUCCESS:
606 switch (bgi->status) {
607 case MYRB_BGI_INVALID:
608 break;
609 case MYRB_BGI_STARTED:
610 if (!sdev)
611 break;
612 sdev_printk(KERN_INFO, sdev,
613 "Background Initialization Started\n");
614 break;
615 case MYRB_BGI_INPROGRESS:
616 if (!sdev)
617 break;
618 if (bgi->blocks_done == last_bgi->blocks_done &&
619 bgi->ldev_num == last_bgi->ldev_num)
620 break;
621 sdev_printk(KERN_INFO, sdev,
622 "Background Initialization in Progress: %d%% completed\n",
623 (100 * (bgi->blocks_done >> 7))
624 / (bgi->ldev_size >> 7));
625 break;
626 case MYRB_BGI_SUSPENDED:
627 if (!sdev)
628 break;
629 sdev_printk(KERN_INFO, sdev,
630 "Background Initialization Suspended\n");
631 break;
632 case MYRB_BGI_CANCELLED:
633 if (!sdev)
634 break;
635 sdev_printk(KERN_INFO, sdev,
636 "Background Initialization Cancelled\n");
637 break;
638 }
639 memcpy(&cb->bgi_status, bgi, sizeof(struct myrb_bgi_status));
640 break;
641 case MYRB_STATUS_BGI_SUCCESS:
642 if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS)
643 sdev_printk(KERN_INFO, sdev,
644 "Background Initialization Completed Successfully\n");
645 cb->bgi_status.status = MYRB_BGI_INVALID;
646 break;
647 case MYRB_STATUS_BGI_ABORTED:
648 if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS)
649 sdev_printk(KERN_INFO, sdev,
650 "Background Initialization Aborted\n");
Gustavo A. R. Silvadf561f662020-08-23 17:36:59 -0500651 fallthrough;
Hannes Reinecke081ff392018-10-17 17:25:11 +0200652 case MYRB_STATUS_NO_BGI_INPROGRESS:
653 cb->bgi_status.status = MYRB_BGI_INVALID;
654 break;
655 }
656 if (sdev)
657 scsi_device_put(sdev);
658 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status),
659 bgi, bgi_addr);
660}
661
Lee Jones12a1b742021-03-17 09:11:55 +0000662/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200663 * myrb_hba_enquiry - updates the controller status
664 *
665 * Executes a DAC_V1_Enquiry command and updates the controller status.
666 *
667 * Return: command status
668 */
669static unsigned short myrb_hba_enquiry(struct myrb_hba *cb)
670{
671 struct myrb_enquiry old, *new;
672 unsigned short status;
673
674 memcpy(&old, cb->enquiry, sizeof(struct myrb_enquiry));
675
676 status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY, cb->enquiry_addr);
677 if (status != MYRB_STATUS_SUCCESS)
678 return status;
679
680 new = cb->enquiry;
681 if (new->ldev_count > old.ldev_count) {
682 int ldev_num = old.ldev_count - 1;
683
684 while (++ldev_num < new->ldev_count)
685 shost_printk(KERN_CRIT, cb->host,
686 "Logical Drive %d Now Exists\n",
687 ldev_num);
688 }
689 if (new->ldev_count < old.ldev_count) {
690 int ldev_num = new->ldev_count - 1;
691
692 while (++ldev_num < old.ldev_count)
693 shost_printk(KERN_CRIT, cb->host,
694 "Logical Drive %d No Longer Exists\n",
695 ldev_num);
696 }
697 if (new->status.deferred != old.status.deferred)
698 shost_printk(KERN_CRIT, cb->host,
699 "Deferred Write Error Flag is now %s\n",
700 (new->status.deferred ? "TRUE" : "FALSE"));
701 if (new->ev_seq != old.ev_seq) {
702 cb->new_ev_seq = new->ev_seq;
703 cb->need_err_info = true;
704 shost_printk(KERN_INFO, cb->host,
705 "Event log %d/%d (%d/%d) available\n",
706 cb->old_ev_seq, cb->new_ev_seq,
707 old.ev_seq, new->ev_seq);
708 }
709 if ((new->ldev_critical > 0 &&
710 new->ldev_critical != old.ldev_critical) ||
711 (new->ldev_offline > 0 &&
712 new->ldev_offline != old.ldev_offline) ||
713 (new->ldev_count != old.ldev_count)) {
714 shost_printk(KERN_INFO, cb->host,
715 "Logical drive count changed (%d/%d/%d)\n",
716 new->ldev_critical,
717 new->ldev_offline,
718 new->ldev_count);
719 cb->need_ldev_info = true;
720 }
721 if (new->pdev_dead > 0 ||
722 new->pdev_dead != old.pdev_dead ||
723 time_after_eq(jiffies, cb->secondary_monitor_time
724 + MYRB_SECONDARY_MONITOR_INTERVAL)) {
725 cb->need_bgi_status = cb->bgi_status_supported;
726 cb->secondary_monitor_time = jiffies;
727 }
728 if (new->rbld == MYRB_STDBY_RBLD_IN_PROGRESS ||
729 new->rbld == MYRB_BG_RBLD_IN_PROGRESS ||
730 old.rbld == MYRB_STDBY_RBLD_IN_PROGRESS ||
731 old.rbld == MYRB_BG_RBLD_IN_PROGRESS) {
732 cb->need_rbld = true;
733 cb->rbld_first = (new->ldev_critical < old.ldev_critical);
734 }
735 if (old.rbld == MYRB_BG_CHECK_IN_PROGRESS)
736 switch (new->rbld) {
737 case MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS:
738 shost_printk(KERN_INFO, cb->host,
739 "Consistency Check Completed Successfully\n");
740 break;
741 case MYRB_STDBY_RBLD_IN_PROGRESS:
742 case MYRB_BG_RBLD_IN_PROGRESS:
743 break;
744 case MYRB_BG_CHECK_IN_PROGRESS:
745 cb->need_cc_status = true;
746 break;
747 case MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR:
748 shost_printk(KERN_INFO, cb->host,
749 "Consistency Check Completed with Error\n");
750 break;
751 case MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED:
752 shost_printk(KERN_INFO, cb->host,
753 "Consistency Check Failed - Physical Device Failed\n");
754 break;
755 case MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED:
756 shost_printk(KERN_INFO, cb->host,
757 "Consistency Check Failed - Logical Drive Failed\n");
758 break;
759 case MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER:
760 shost_printk(KERN_INFO, cb->host,
761 "Consistency Check Failed - Other Causes\n");
762 break;
763 case MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED:
764 shost_printk(KERN_INFO, cb->host,
765 "Consistency Check Successfully Terminated\n");
766 break;
767 }
768 else if (new->rbld == MYRB_BG_CHECK_IN_PROGRESS)
769 cb->need_cc_status = true;
770
771 return MYRB_STATUS_SUCCESS;
772}
773
Lee Jones12a1b742021-03-17 09:11:55 +0000774/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200775 * myrb_set_pdev_state - sets the device state for a physical device
776 *
777 * Return: command status
778 */
779static unsigned short myrb_set_pdev_state(struct myrb_hba *cb,
780 struct scsi_device *sdev, enum myrb_devstate state)
781{
782 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
783 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
784 unsigned short status;
785
786 mutex_lock(&cb->dcmd_mutex);
787 mbox->type3D.opcode = MYRB_CMD_START_DEVICE;
788 mbox->type3D.id = MYRB_DCMD_TAG;
789 mbox->type3D.channel = sdev->channel;
790 mbox->type3D.target = sdev->id;
791 mbox->type3D.state = state & 0x1F;
792 status = myrb_exec_cmd(cb, cmd_blk);
793 mutex_unlock(&cb->dcmd_mutex);
794
795 return status;
796}
797
Lee Jones12a1b742021-03-17 09:11:55 +0000798/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200799 * myrb_enable_mmio - enables the Memory Mailbox Interface
800 *
801 * PD and P controller types have no memory mailbox, but still need the
802 * other dma mapped memory.
803 *
804 * Return: true on success, false otherwise.
805 */
806static bool myrb_enable_mmio(struct myrb_hba *cb, mbox_mmio_init_t mmio_init_fn)
807{
808 void __iomem *base = cb->io_base;
809 struct pci_dev *pdev = cb->pdev;
810 size_t err_table_size;
811 size_t ldev_info_size;
812 union myrb_cmd_mbox *cmd_mbox_mem;
813 struct myrb_stat_mbox *stat_mbox_mem;
814 union myrb_cmd_mbox mbox;
815 unsigned short status;
816
817 memset(&mbox, 0, sizeof(union myrb_cmd_mbox));
818
819 if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
820 dev_err(&pdev->dev, "DMA mask out of range\n");
821 return false;
822 }
823
824 cb->enquiry = dma_alloc_coherent(&pdev->dev,
825 sizeof(struct myrb_enquiry),
826 &cb->enquiry_addr, GFP_KERNEL);
827 if (!cb->enquiry)
828 return false;
829
830 err_table_size = sizeof(struct myrb_error_entry) *
831 MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS;
832 cb->err_table = dma_alloc_coherent(&pdev->dev, err_table_size,
833 &cb->err_table_addr, GFP_KERNEL);
834 if (!cb->err_table)
835 return false;
836
837 ldev_info_size = sizeof(struct myrb_ldev_info) * MYRB_MAX_LDEVS;
838 cb->ldev_info_buf = dma_alloc_coherent(&pdev->dev, ldev_info_size,
839 &cb->ldev_info_addr, GFP_KERNEL);
840 if (!cb->ldev_info_buf)
841 return false;
842
843 /*
844 * Skip mailbox initialisation for PD and P Controllers
845 */
846 if (!mmio_init_fn)
847 return true;
848
849 /* These are the base addresses for the command memory mailbox array */
850 cb->cmd_mbox_size = MYRB_CMD_MBOX_COUNT * sizeof(union myrb_cmd_mbox);
851 cb->first_cmd_mbox = dma_alloc_coherent(&pdev->dev,
852 cb->cmd_mbox_size,
853 &cb->cmd_mbox_addr,
854 GFP_KERNEL);
855 if (!cb->first_cmd_mbox)
856 return false;
857
858 cmd_mbox_mem = cb->first_cmd_mbox;
859 cmd_mbox_mem += MYRB_CMD_MBOX_COUNT - 1;
860 cb->last_cmd_mbox = cmd_mbox_mem;
861 cb->next_cmd_mbox = cb->first_cmd_mbox;
862 cb->prev_cmd_mbox1 = cb->last_cmd_mbox;
863 cb->prev_cmd_mbox2 = cb->last_cmd_mbox - 1;
864
865 /* These are the base addresses for the status memory mailbox array */
866 cb->stat_mbox_size = MYRB_STAT_MBOX_COUNT *
867 sizeof(struct myrb_stat_mbox);
868 cb->first_stat_mbox = dma_alloc_coherent(&pdev->dev,
869 cb->stat_mbox_size,
870 &cb->stat_mbox_addr,
871 GFP_KERNEL);
872 if (!cb->first_stat_mbox)
873 return false;
874
875 stat_mbox_mem = cb->first_stat_mbox;
876 stat_mbox_mem += MYRB_STAT_MBOX_COUNT - 1;
877 cb->last_stat_mbox = stat_mbox_mem;
878 cb->next_stat_mbox = cb->first_stat_mbox;
879
880 /* Enable the Memory Mailbox Interface. */
881 cb->dual_mode_interface = true;
882 mbox.typeX.opcode = 0x2B;
883 mbox.typeX.id = 0;
884 mbox.typeX.opcode2 = 0x14;
885 mbox.typeX.cmd_mbox_addr = cb->cmd_mbox_addr;
886 mbox.typeX.stat_mbox_addr = cb->stat_mbox_addr;
887
888 status = mmio_init_fn(pdev, base, &mbox);
889 if (status != MYRB_STATUS_SUCCESS) {
890 cb->dual_mode_interface = false;
891 mbox.typeX.opcode2 = 0x10;
892 status = mmio_init_fn(pdev, base, &mbox);
893 if (status != MYRB_STATUS_SUCCESS) {
894 dev_err(&pdev->dev,
895 "Failed to enable mailbox, statux %02X\n",
896 status);
897 return false;
898 }
899 }
900 return true;
901}
902
Lee Jones12a1b742021-03-17 09:11:55 +0000903/*
Hannes Reinecke081ff392018-10-17 17:25:11 +0200904 * myrb_get_hba_config - reads the configuration information
905 *
906 * Reads the configuration information from the controller and
907 * initializes the controller structure.
908 *
909 * Return: 0 on success, errno otherwise
910 */
911static int myrb_get_hba_config(struct myrb_hba *cb)
912{
913 struct myrb_enquiry2 *enquiry2;
914 dma_addr_t enquiry2_addr;
915 struct myrb_config2 *config2;
916 dma_addr_t config2_addr;
917 struct Scsi_Host *shost = cb->host;
918 struct pci_dev *pdev = cb->pdev;
919 int pchan_max = 0, pchan_cur = 0;
920 unsigned short status;
921 int ret = -ENODEV, memsize = 0;
922
923 enquiry2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
924 &enquiry2_addr, GFP_KERNEL);
925 if (!enquiry2) {
926 shost_printk(KERN_ERR, cb->host,
927 "Failed to allocate V1 enquiry2 memory\n");
928 return -ENOMEM;
929 }
930 config2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_config2),
931 &config2_addr, GFP_KERNEL);
932 if (!config2) {
933 shost_printk(KERN_ERR, cb->host,
934 "Failed to allocate V1 config2 memory\n");
935 dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
936 enquiry2, enquiry2_addr);
937 return -ENOMEM;
938 }
939 mutex_lock(&cb->dma_mutex);
940 status = myrb_hba_enquiry(cb);
941 mutex_unlock(&cb->dma_mutex);
942 if (status != MYRB_STATUS_SUCCESS) {
943 shost_printk(KERN_WARNING, cb->host,
944 "Failed it issue V1 Enquiry\n");
945 goto out_free;
946 }
947
948 status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY2, enquiry2_addr);
949 if (status != MYRB_STATUS_SUCCESS) {
950 shost_printk(KERN_WARNING, cb->host,
951 "Failed to issue V1 Enquiry2\n");
952 goto out_free;
953 }
954
955 status = myrb_exec_type3(cb, MYRB_CMD_READ_CONFIG2, config2_addr);
956 if (status != MYRB_STATUS_SUCCESS) {
957 shost_printk(KERN_WARNING, cb->host,
958 "Failed to issue ReadConfig2\n");
959 goto out_free;
960 }
961
962 status = myrb_get_ldev_info(cb);
963 if (status != MYRB_STATUS_SUCCESS) {
964 shost_printk(KERN_WARNING, cb->host,
965 "Failed to get logical drive information\n");
966 goto out_free;
967 }
968
969 /*
970 * Initialize the Controller Model Name and Full Model Name fields.
971 */
972 switch (enquiry2->hw.sub_model) {
973 case DAC960_V1_P_PD_PU:
974 if (enquiry2->scsi_cap.bus_speed == MYRB_SCSI_SPEED_ULTRA)
975 strcpy(cb->model_name, "DAC960PU");
976 else
977 strcpy(cb->model_name, "DAC960PD");
978 break;
979 case DAC960_V1_PL:
980 strcpy(cb->model_name, "DAC960PL");
981 break;
982 case DAC960_V1_PG:
983 strcpy(cb->model_name, "DAC960PG");
984 break;
985 case DAC960_V1_PJ:
986 strcpy(cb->model_name, "DAC960PJ");
987 break;
988 case DAC960_V1_PR:
989 strcpy(cb->model_name, "DAC960PR");
990 break;
991 case DAC960_V1_PT:
992 strcpy(cb->model_name, "DAC960PT");
993 break;
994 case DAC960_V1_PTL0:
995 strcpy(cb->model_name, "DAC960PTL0");
996 break;
997 case DAC960_V1_PRL:
998 strcpy(cb->model_name, "DAC960PRL");
999 break;
1000 case DAC960_V1_PTL1:
1001 strcpy(cb->model_name, "DAC960PTL1");
1002 break;
1003 case DAC960_V1_1164P:
1004 strcpy(cb->model_name, "eXtremeRAID 1100");
1005 break;
1006 default:
1007 shost_printk(KERN_WARNING, cb->host,
1008 "Unknown Model %X\n",
1009 enquiry2->hw.sub_model);
1010 goto out;
1011 }
1012 /*
1013 * Initialize the Controller Firmware Version field and verify that it
1014 * is a supported firmware version.
1015 * The supported firmware versions are:
1016 *
1017 * DAC1164P 5.06 and above
1018 * DAC960PTL/PRL/PJ/PG 4.06 and above
1019 * DAC960PU/PD/PL 3.51 and above
1020 * DAC960PU/PD/PL/P 2.73 and above
1021 */
1022#if defined(CONFIG_ALPHA)
1023 /*
1024 * DEC Alpha machines were often equipped with DAC960 cards that were
1025 * OEMed from Mylex, and had their own custom firmware. Version 2.70,
1026 * the last custom FW revision to be released by DEC for these older
1027 * controllers, appears to work quite well with this driver.
1028 *
1029 * Cards tested successfully were several versions each of the PD and
1030 * PU, called by DEC the KZPSC and KZPAC, respectively, and having
1031 * the Manufacturer Numbers (from Mylex), usually on a sticker on the
1032 * back of the board, of:
1033 *
1034 * KZPSC: D040347 (1-channel) or D040348 (2-channel)
1035 * or D040349 (3-channel)
1036 * KZPAC: D040395 (1-channel) or D040396 (2-channel)
1037 * or D040397 (3-channel)
1038 */
1039# define FIRMWARE_27X "2.70"
1040#else
1041# define FIRMWARE_27X "2.73"
1042#endif
1043
1044 if (enquiry2->fw.major_version == 0) {
1045 enquiry2->fw.major_version = cb->enquiry->fw_major_version;
1046 enquiry2->fw.minor_version = cb->enquiry->fw_minor_version;
1047 enquiry2->fw.firmware_type = '0';
1048 enquiry2->fw.turn_id = 0;
1049 }
Arnd Bergmannf8f4adc2018-11-02 16:34:49 +01001050 snprintf(cb->fw_version, sizeof(cb->fw_version),
Ye Binfc29f042020-09-30 10:16:37 +08001051 "%u.%02u-%c-%02u",
Hannes Reinecke081ff392018-10-17 17:25:11 +02001052 enquiry2->fw.major_version,
1053 enquiry2->fw.minor_version,
1054 enquiry2->fw.firmware_type,
1055 enquiry2->fw.turn_id);
1056 if (!((enquiry2->fw.major_version == 5 &&
1057 enquiry2->fw.minor_version >= 6) ||
1058 (enquiry2->fw.major_version == 4 &&
1059 enquiry2->fw.minor_version >= 6) ||
1060 (enquiry2->fw.major_version == 3 &&
1061 enquiry2->fw.minor_version >= 51) ||
1062 (enquiry2->fw.major_version == 2 &&
1063 strcmp(cb->fw_version, FIRMWARE_27X) >= 0))) {
1064 shost_printk(KERN_WARNING, cb->host,
1065 "Firmware Version '%s' unsupported\n",
1066 cb->fw_version);
1067 goto out;
1068 }
1069 /*
1070 * Initialize the Channels, Targets, Memory Size, and SAF-TE
1071 * Enclosure Management Enabled fields.
1072 */
1073 switch (enquiry2->hw.model) {
1074 case MYRB_5_CHANNEL_BOARD:
1075 pchan_max = 5;
1076 break;
1077 case MYRB_3_CHANNEL_BOARD:
1078 case MYRB_3_CHANNEL_ASIC_DAC:
1079 pchan_max = 3;
1080 break;
1081 case MYRB_2_CHANNEL_BOARD:
1082 pchan_max = 2;
1083 break;
1084 default:
1085 pchan_max = enquiry2->cfg_chan;
1086 break;
1087 }
1088 pchan_cur = enquiry2->cur_chan;
1089 if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_32BIT)
1090 cb->bus_width = 32;
1091 else if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_16BIT)
1092 cb->bus_width = 16;
1093 else
1094 cb->bus_width = 8;
1095 cb->ldev_block_size = enquiry2->ldev_block_size;
1096 shost->max_channel = pchan_cur;
1097 shost->max_id = enquiry2->max_targets;
1098 memsize = enquiry2->mem_size >> 20;
1099 cb->safte_enabled = (enquiry2->fault_mgmt == MYRB_FAULT_SAFTE);
1100 /*
1101 * Initialize the Controller Queue Depth, Driver Queue Depth,
1102 * Logical Drive Count, Maximum Blocks per Command, Controller
1103 * Scatter/Gather Limit, and Driver Scatter/Gather Limit.
1104 * The Driver Queue Depth must be at most one less than the
1105 * Controller Queue Depth to allow for an automatic drive
1106 * rebuild operation.
1107 */
1108 shost->can_queue = cb->enquiry->max_tcq;
1109 if (shost->can_queue < 3)
1110 shost->can_queue = enquiry2->max_cmds;
1111 if (shost->can_queue < 3)
1112 /* Play safe and disable TCQ */
1113 shost->can_queue = 1;
1114
1115 if (shost->can_queue > MYRB_CMD_MBOX_COUNT - 2)
1116 shost->can_queue = MYRB_CMD_MBOX_COUNT - 2;
1117 shost->max_sectors = enquiry2->max_sectors;
1118 shost->sg_tablesize = enquiry2->max_sge;
1119 if (shost->sg_tablesize > MYRB_SCATTER_GATHER_LIMIT)
1120 shost->sg_tablesize = MYRB_SCATTER_GATHER_LIMIT;
1121 /*
1122 * Initialize the Stripe Size, Segment Size, and Geometry Translation.
1123 */
1124 cb->stripe_size = config2->blocks_per_stripe * config2->block_factor
1125 >> (10 - MYRB_BLKSIZE_BITS);
1126 cb->segment_size = config2->blocks_per_cacheline * config2->block_factor
1127 >> (10 - MYRB_BLKSIZE_BITS);
1128 /* Assume 255/63 translation */
1129 cb->ldev_geom_heads = 255;
1130 cb->ldev_geom_sectors = 63;
1131 if (config2->drive_geometry) {
1132 cb->ldev_geom_heads = 128;
1133 cb->ldev_geom_sectors = 32;
1134 }
1135
1136 /*
1137 * Initialize the Background Initialization Status.
1138 */
1139 if ((cb->fw_version[0] == '4' &&
1140 strcmp(cb->fw_version, "4.08") >= 0) ||
1141 (cb->fw_version[0] == '5' &&
1142 strcmp(cb->fw_version, "5.08") >= 0)) {
1143 cb->bgi_status_supported = true;
1144 myrb_bgi_control(cb);
1145 }
1146 cb->last_rbld_status = MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS;
1147 ret = 0;
1148
1149out:
1150 shost_printk(KERN_INFO, cb->host,
1151 "Configuring %s PCI RAID Controller\n", cb->model_name);
1152 shost_printk(KERN_INFO, cb->host,
1153 " Firmware Version: %s, Memory Size: %dMB\n",
1154 cb->fw_version, memsize);
1155 if (cb->io_addr == 0)
1156 shost_printk(KERN_INFO, cb->host,
1157 " I/O Address: n/a, PCI Address: 0x%lX, IRQ Channel: %d\n",
1158 (unsigned long)cb->pci_addr, cb->irq);
1159 else
1160 shost_printk(KERN_INFO, cb->host,
1161 " I/O Address: 0x%lX, PCI Address: 0x%lX, IRQ Channel: %d\n",
1162 (unsigned long)cb->io_addr, (unsigned long)cb->pci_addr,
1163 cb->irq);
1164 shost_printk(KERN_INFO, cb->host,
1165 " Controller Queue Depth: %d, Maximum Blocks per Command: %d\n",
1166 cb->host->can_queue, cb->host->max_sectors);
1167 shost_printk(KERN_INFO, cb->host,
1168 " Driver Queue Depth: %d, Scatter/Gather Limit: %d of %d Segments\n",
1169 cb->host->can_queue, cb->host->sg_tablesize,
1170 MYRB_SCATTER_GATHER_LIMIT);
1171 shost_printk(KERN_INFO, cb->host,
1172 " Stripe Size: %dKB, Segment Size: %dKB, BIOS Geometry: %d/%d%s\n",
1173 cb->stripe_size, cb->segment_size,
1174 cb->ldev_geom_heads, cb->ldev_geom_sectors,
1175 cb->safte_enabled ?
1176 " SAF-TE Enclosure Management Enabled" : "");
1177 shost_printk(KERN_INFO, cb->host,
1178 " Physical: %d/%d channels %d/%d/%d devices\n",
1179 pchan_cur, pchan_max, 0, cb->enquiry->pdev_dead,
1180 cb->host->max_id);
1181
1182 shost_printk(KERN_INFO, cb->host,
1183 " Logical: 1/1 channels, %d/%d disks\n",
1184 cb->enquiry->ldev_count, MYRB_MAX_LDEVS);
1185
1186out_free:
1187 dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
1188 enquiry2, enquiry2_addr);
1189 dma_free_coherent(&pdev->dev, sizeof(struct myrb_config2),
1190 config2, config2_addr);
1191
1192 return ret;
1193}
1194
Lee Jones12a1b742021-03-17 09:11:55 +00001195/*
Hannes Reinecke081ff392018-10-17 17:25:11 +02001196 * myrb_unmap - unmaps controller structures
1197 */
1198static void myrb_unmap(struct myrb_hba *cb)
1199{
1200 if (cb->ldev_info_buf) {
1201 size_t ldev_info_size = sizeof(struct myrb_ldev_info) *
1202 MYRB_MAX_LDEVS;
1203 dma_free_coherent(&cb->pdev->dev, ldev_info_size,
1204 cb->ldev_info_buf, cb->ldev_info_addr);
1205 cb->ldev_info_buf = NULL;
1206 }
1207 if (cb->err_table) {
1208 size_t err_table_size = sizeof(struct myrb_error_entry) *
1209 MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS;
1210 dma_free_coherent(&cb->pdev->dev, err_table_size,
1211 cb->err_table, cb->err_table_addr);
1212 cb->err_table = NULL;
1213 }
1214 if (cb->enquiry) {
1215 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_enquiry),
1216 cb->enquiry, cb->enquiry_addr);
1217 cb->enquiry = NULL;
1218 }
1219 if (cb->first_stat_mbox) {
1220 dma_free_coherent(&cb->pdev->dev, cb->stat_mbox_size,
1221 cb->first_stat_mbox, cb->stat_mbox_addr);
1222 cb->first_stat_mbox = NULL;
1223 }
1224 if (cb->first_cmd_mbox) {
1225 dma_free_coherent(&cb->pdev->dev, cb->cmd_mbox_size,
1226 cb->first_cmd_mbox, cb->cmd_mbox_addr);
1227 cb->first_cmd_mbox = NULL;
1228 }
1229}
1230
Lee Jones12a1b742021-03-17 09:11:55 +00001231/*
Hannes Reinecke081ff392018-10-17 17:25:11 +02001232 * myrb_cleanup - cleanup controller structures
1233 */
1234static void myrb_cleanup(struct myrb_hba *cb)
1235{
1236 struct pci_dev *pdev = cb->pdev;
1237
1238 /* Free the memory mailbox, status, and related structures */
1239 myrb_unmap(cb);
1240
1241 if (cb->mmio_base) {
1242 cb->disable_intr(cb->io_base);
1243 iounmap(cb->mmio_base);
1244 }
1245 if (cb->irq)
1246 free_irq(cb->irq, cb);
1247 if (cb->io_addr)
1248 release_region(cb->io_addr, 0x80);
1249 pci_set_drvdata(pdev, NULL);
1250 pci_disable_device(pdev);
1251 scsi_host_put(cb->host);
1252}
1253
1254static int myrb_host_reset(struct scsi_cmnd *scmd)
1255{
1256 struct Scsi_Host *shost = scmd->device->host;
1257 struct myrb_hba *cb = shost_priv(shost);
1258
1259 cb->reset(cb->io_base);
1260 return SUCCESS;
1261}
1262
1263static int myrb_pthru_queuecommand(struct Scsi_Host *shost,
1264 struct scsi_cmnd *scmd)
1265{
1266 struct myrb_hba *cb = shost_priv(shost);
1267 struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1268 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1269 struct myrb_dcdb *dcdb;
1270 dma_addr_t dcdb_addr;
1271 struct scsi_device *sdev = scmd->device;
1272 struct scatterlist *sgl;
1273 unsigned long flags;
1274 int nsge;
1275
1276 myrb_reset_cmd(cmd_blk);
1277 dcdb = dma_pool_alloc(cb->dcdb_pool, GFP_ATOMIC, &dcdb_addr);
1278 if (!dcdb)
1279 return SCSI_MLQUEUE_HOST_BUSY;
1280 nsge = scsi_dma_map(scmd);
1281 if (nsge > 1) {
1282 dma_pool_free(cb->dcdb_pool, dcdb, dcdb_addr);
1283 scmd->result = (DID_ERROR << 16);
1284 scmd->scsi_done(scmd);
1285 return 0;
1286 }
1287
1288 mbox->type3.opcode = MYRB_CMD_DCDB;
1289 mbox->type3.id = scmd->request->tag + 3;
1290 mbox->type3.addr = dcdb_addr;
1291 dcdb->channel = sdev->channel;
1292 dcdb->target = sdev->id;
1293 switch (scmd->sc_data_direction) {
1294 case DMA_NONE:
1295 dcdb->data_xfer = MYRB_DCDB_XFER_NONE;
1296 break;
1297 case DMA_TO_DEVICE:
1298 dcdb->data_xfer = MYRB_DCDB_XFER_SYSTEM_TO_DEVICE;
1299 break;
1300 case DMA_FROM_DEVICE:
1301 dcdb->data_xfer = MYRB_DCDB_XFER_DEVICE_TO_SYSTEM;
1302 break;
1303 default:
1304 dcdb->data_xfer = MYRB_DCDB_XFER_ILLEGAL;
1305 break;
1306 }
1307 dcdb->early_status = false;
1308 if (scmd->request->timeout <= 10)
1309 dcdb->timeout = MYRB_DCDB_TMO_10_SECS;
1310 else if (scmd->request->timeout <= 60)
1311 dcdb->timeout = MYRB_DCDB_TMO_60_SECS;
1312 else if (scmd->request->timeout <= 600)
1313 dcdb->timeout = MYRB_DCDB_TMO_10_MINS;
1314 else
1315 dcdb->timeout = MYRB_DCDB_TMO_24_HRS;
1316 dcdb->no_autosense = false;
1317 dcdb->allow_disconnect = true;
1318 sgl = scsi_sglist(scmd);
1319 dcdb->dma_addr = sg_dma_address(sgl);
1320 if (sg_dma_len(sgl) > USHRT_MAX) {
1321 dcdb->xfer_len_lo = sg_dma_len(sgl) & 0xffff;
1322 dcdb->xfer_len_hi4 = sg_dma_len(sgl) >> 16;
1323 } else {
1324 dcdb->xfer_len_lo = sg_dma_len(sgl);
1325 dcdb->xfer_len_hi4 = 0;
1326 }
1327 dcdb->cdb_len = scmd->cmd_len;
1328 dcdb->sense_len = sizeof(dcdb->sense);
1329 memcpy(&dcdb->cdb, scmd->cmnd, scmd->cmd_len);
1330
1331 spin_lock_irqsave(&cb->queue_lock, flags);
1332 cb->qcmd(cb, cmd_blk);
1333 spin_unlock_irqrestore(&cb->queue_lock, flags);
1334 return 0;
1335}
1336
1337static void myrb_inquiry(struct myrb_hba *cb,
1338 struct scsi_cmnd *scmd)
1339{
1340 unsigned char inq[36] = {
1341 0x00, 0x00, 0x03, 0x02, 0x20, 0x00, 0x01, 0x00,
1342 0x4d, 0x59, 0x4c, 0x45, 0x58, 0x20, 0x20, 0x20,
1343 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1344 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1345 0x20, 0x20, 0x20, 0x20,
1346 };
1347
1348 if (cb->bus_width > 16)
1349 inq[7] |= 1 << 6;
1350 if (cb->bus_width > 8)
1351 inq[7] |= 1 << 5;
1352 memcpy(&inq[16], cb->model_name, 16);
1353 memcpy(&inq[32], cb->fw_version, 1);
1354 memcpy(&inq[33], &cb->fw_version[2], 2);
1355 memcpy(&inq[35], &cb->fw_version[7], 1);
1356
1357 scsi_sg_copy_from_buffer(scmd, (void *)inq, 36);
1358}
1359
1360static void
1361myrb_mode_sense(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1362 struct myrb_ldev_info *ldev_info)
1363{
1364 unsigned char modes[32], *mode_pg;
1365 bool dbd;
1366 size_t mode_len;
1367
1368 dbd = (scmd->cmnd[1] & 0x08) == 0x08;
1369 if (dbd) {
1370 mode_len = 24;
1371 mode_pg = &modes[4];
1372 } else {
1373 mode_len = 32;
1374 mode_pg = &modes[12];
1375 }
1376 memset(modes, 0, sizeof(modes));
1377 modes[0] = mode_len - 1;
1378 if (!dbd) {
1379 unsigned char *block_desc = &modes[4];
1380
1381 modes[3] = 8;
1382 put_unaligned_be32(ldev_info->size, &block_desc[0]);
1383 put_unaligned_be32(cb->ldev_block_size, &block_desc[5]);
1384 }
1385 mode_pg[0] = 0x08;
1386 mode_pg[1] = 0x12;
1387 if (ldev_info->wb_enabled)
1388 mode_pg[2] |= 0x04;
1389 if (cb->segment_size) {
1390 mode_pg[2] |= 0x08;
1391 put_unaligned_be16(cb->segment_size, &mode_pg[14]);
1392 }
1393
1394 scsi_sg_copy_from_buffer(scmd, modes, mode_len);
1395}
1396
1397static void myrb_request_sense(struct myrb_hba *cb,
1398 struct scsi_cmnd *scmd)
1399{
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001400 scsi_build_sense(scmd, 0, NO_SENSE, 0, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001401 scsi_sg_copy_from_buffer(scmd, scmd->sense_buffer,
1402 SCSI_SENSE_BUFFERSIZE);
1403}
1404
1405static void myrb_read_capacity(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1406 struct myrb_ldev_info *ldev_info)
1407{
1408 unsigned char data[8];
1409
1410 dev_dbg(&scmd->device->sdev_gendev,
1411 "Capacity %u, blocksize %u\n",
1412 ldev_info->size, cb->ldev_block_size);
1413 put_unaligned_be32(ldev_info->size - 1, &data[0]);
1414 put_unaligned_be32(cb->ldev_block_size, &data[4]);
1415 scsi_sg_copy_from_buffer(scmd, data, 8);
1416}
1417
1418static int myrb_ldev_queuecommand(struct Scsi_Host *shost,
1419 struct scsi_cmnd *scmd)
1420{
1421 struct myrb_hba *cb = shost_priv(shost);
1422 struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1423 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1424 struct myrb_ldev_info *ldev_info;
1425 struct scsi_device *sdev = scmd->device;
1426 struct scatterlist *sgl;
1427 unsigned long flags;
1428 u64 lba;
1429 u32 block_cnt;
1430 int nsge;
1431
1432 ldev_info = sdev->hostdata;
1433 if (ldev_info->state != MYRB_DEVICE_ONLINE &&
1434 ldev_info->state != MYRB_DEVICE_WO) {
1435 dev_dbg(&shost->shost_gendev, "ldev %u in state %x, skip\n",
1436 sdev->id, ldev_info ? ldev_info->state : 0xff);
1437 scmd->result = (DID_BAD_TARGET << 16);
1438 scmd->scsi_done(scmd);
1439 return 0;
1440 }
1441 switch (scmd->cmnd[0]) {
1442 case TEST_UNIT_READY:
1443 scmd->result = (DID_OK << 16);
1444 scmd->scsi_done(scmd);
1445 return 0;
1446 case INQUIRY:
1447 if (scmd->cmnd[1] & 1) {
1448 /* Illegal request, invalid field in CDB */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001449 scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001450 } else {
1451 myrb_inquiry(cb, scmd);
1452 scmd->result = (DID_OK << 16);
1453 }
1454 scmd->scsi_done(scmd);
1455 return 0;
1456 case SYNCHRONIZE_CACHE:
1457 scmd->result = (DID_OK << 16);
1458 scmd->scsi_done(scmd);
1459 return 0;
1460 case MODE_SENSE:
1461 if ((scmd->cmnd[2] & 0x3F) != 0x3F &&
1462 (scmd->cmnd[2] & 0x3F) != 0x08) {
1463 /* Illegal request, invalid field in CDB */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001464 scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001465 } else {
1466 myrb_mode_sense(cb, scmd, ldev_info);
1467 scmd->result = (DID_OK << 16);
1468 }
1469 scmd->scsi_done(scmd);
1470 return 0;
1471 case READ_CAPACITY:
1472 if ((scmd->cmnd[1] & 1) ||
1473 (scmd->cmnd[8] & 1)) {
1474 /* Illegal request, invalid field in CDB */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001475 scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001476 scmd->scsi_done(scmd);
1477 return 0;
1478 }
1479 lba = get_unaligned_be32(&scmd->cmnd[2]);
1480 if (lba) {
1481 /* Illegal request, invalid field in CDB */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001482 scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001483 scmd->scsi_done(scmd);
1484 return 0;
1485 }
1486 myrb_read_capacity(cb, scmd, ldev_info);
1487 scmd->scsi_done(scmd);
1488 return 0;
1489 case REQUEST_SENSE:
1490 myrb_request_sense(cb, scmd);
1491 scmd->result = (DID_OK << 16);
1492 return 0;
1493 case SEND_DIAGNOSTIC:
1494 if (scmd->cmnd[1] != 0x04) {
1495 /* Illegal request, invalid field in CDB */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001496 scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001497 } else {
1498 /* Assume good status */
1499 scmd->result = (DID_OK << 16);
1500 }
1501 scmd->scsi_done(scmd);
1502 return 0;
1503 case READ_6:
1504 if (ldev_info->state == MYRB_DEVICE_WO) {
1505 /* Data protect, attempt to read invalid data */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001506 scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001507 scmd->scsi_done(scmd);
1508 return 0;
1509 }
Gustavo A. R. Silvadf561f662020-08-23 17:36:59 -05001510 fallthrough;
Hannes Reinecke081ff392018-10-17 17:25:11 +02001511 case WRITE_6:
1512 lba = (((scmd->cmnd[1] & 0x1F) << 16) |
1513 (scmd->cmnd[2] << 8) |
1514 scmd->cmnd[3]);
1515 block_cnt = scmd->cmnd[4];
1516 break;
1517 case READ_10:
1518 if (ldev_info->state == MYRB_DEVICE_WO) {
1519 /* Data protect, attempt to read invalid data */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001520 scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001521 scmd->scsi_done(scmd);
1522 return 0;
1523 }
Gustavo A. R. Silvadf561f662020-08-23 17:36:59 -05001524 fallthrough;
Hannes Reinecke081ff392018-10-17 17:25:11 +02001525 case WRITE_10:
1526 case VERIFY: /* 0x2F */
1527 case WRITE_VERIFY: /* 0x2E */
1528 lba = get_unaligned_be32(&scmd->cmnd[2]);
1529 block_cnt = get_unaligned_be16(&scmd->cmnd[7]);
1530 break;
1531 case READ_12:
1532 if (ldev_info->state == MYRB_DEVICE_WO) {
1533 /* Data protect, attempt to read invalid data */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001534 scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001535 scmd->scsi_done(scmd);
1536 return 0;
1537 }
Gustavo A. R. Silvadf561f662020-08-23 17:36:59 -05001538 fallthrough;
Hannes Reinecke081ff392018-10-17 17:25:11 +02001539 case WRITE_12:
1540 case VERIFY_12: /* 0xAF */
1541 case WRITE_VERIFY_12: /* 0xAE */
1542 lba = get_unaligned_be32(&scmd->cmnd[2]);
1543 block_cnt = get_unaligned_be32(&scmd->cmnd[6]);
1544 break;
1545 default:
1546 /* Illegal request, invalid opcode */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02001547 scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x20, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02001548 scmd->scsi_done(scmd);
1549 return 0;
1550 }
1551
1552 myrb_reset_cmd(cmd_blk);
1553 mbox->type5.id = scmd->request->tag + 3;
1554 if (scmd->sc_data_direction == DMA_NONE)
1555 goto submit;
1556 nsge = scsi_dma_map(scmd);
1557 if (nsge == 1) {
1558 sgl = scsi_sglist(scmd);
1559 if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1560 mbox->type5.opcode = MYRB_CMD_READ;
1561 else
1562 mbox->type5.opcode = MYRB_CMD_WRITE;
1563
1564 mbox->type5.ld.xfer_len = block_cnt;
1565 mbox->type5.ld.ldev_num = sdev->id;
1566 mbox->type5.lba = lba;
1567 mbox->type5.addr = (u32)sg_dma_address(sgl);
1568 } else {
1569 struct myrb_sge *hw_sgl;
1570 dma_addr_t hw_sgl_addr;
1571 int i;
1572
1573 hw_sgl = dma_pool_alloc(cb->sg_pool, GFP_ATOMIC, &hw_sgl_addr);
1574 if (!hw_sgl)
1575 return SCSI_MLQUEUE_HOST_BUSY;
1576
1577 cmd_blk->sgl = hw_sgl;
1578 cmd_blk->sgl_addr = hw_sgl_addr;
1579
1580 if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1581 mbox->type5.opcode = MYRB_CMD_READ_SG;
1582 else
1583 mbox->type5.opcode = MYRB_CMD_WRITE_SG;
1584
1585 mbox->type5.ld.xfer_len = block_cnt;
1586 mbox->type5.ld.ldev_num = sdev->id;
1587 mbox->type5.lba = lba;
1588 mbox->type5.addr = hw_sgl_addr;
1589 mbox->type5.sg_count = nsge;
1590
1591 scsi_for_each_sg(scmd, sgl, nsge, i) {
1592 hw_sgl->sge_addr = (u32)sg_dma_address(sgl);
1593 hw_sgl->sge_count = (u32)sg_dma_len(sgl);
1594 hw_sgl++;
1595 }
1596 }
1597submit:
1598 spin_lock_irqsave(&cb->queue_lock, flags);
1599 cb->qcmd(cb, cmd_blk);
1600 spin_unlock_irqrestore(&cb->queue_lock, flags);
1601
1602 return 0;
1603}
1604
1605static int myrb_queuecommand(struct Scsi_Host *shost,
1606 struct scsi_cmnd *scmd)
1607{
1608 struct scsi_device *sdev = scmd->device;
1609
1610 if (sdev->channel > myrb_logical_channel(shost)) {
1611 scmd->result = (DID_BAD_TARGET << 16);
1612 scmd->scsi_done(scmd);
1613 return 0;
1614 }
1615 if (sdev->channel == myrb_logical_channel(shost))
1616 return myrb_ldev_queuecommand(shost, scmd);
1617
1618 return myrb_pthru_queuecommand(shost, scmd);
1619}
1620
1621static int myrb_ldev_slave_alloc(struct scsi_device *sdev)
1622{
1623 struct myrb_hba *cb = shost_priv(sdev->host);
1624 struct myrb_ldev_info *ldev_info;
1625 unsigned short ldev_num = sdev->id;
1626 enum raid_level level;
1627
1628 ldev_info = cb->ldev_info_buf + ldev_num;
1629 if (!ldev_info)
1630 return -ENXIO;
1631
1632 sdev->hostdata = kzalloc(sizeof(*ldev_info), GFP_KERNEL);
1633 if (!sdev->hostdata)
1634 return -ENOMEM;
1635 dev_dbg(&sdev->sdev_gendev,
1636 "slave alloc ldev %d state %x\n",
1637 ldev_num, ldev_info->state);
1638 memcpy(sdev->hostdata, ldev_info,
1639 sizeof(*ldev_info));
1640 switch (ldev_info->raid_level) {
1641 case MYRB_RAID_LEVEL0:
1642 level = RAID_LEVEL_LINEAR;
1643 break;
1644 case MYRB_RAID_LEVEL1:
1645 level = RAID_LEVEL_1;
1646 break;
1647 case MYRB_RAID_LEVEL3:
1648 level = RAID_LEVEL_3;
1649 break;
1650 case MYRB_RAID_LEVEL5:
1651 level = RAID_LEVEL_5;
1652 break;
1653 case MYRB_RAID_LEVEL6:
1654 level = RAID_LEVEL_6;
1655 break;
1656 case MYRB_RAID_JBOD:
1657 level = RAID_LEVEL_JBOD;
1658 break;
1659 default:
1660 level = RAID_LEVEL_UNKNOWN;
1661 break;
1662 }
1663 raid_set_level(myrb_raid_template, &sdev->sdev_gendev, level);
1664 return 0;
1665}
1666
1667static int myrb_pdev_slave_alloc(struct scsi_device *sdev)
1668{
1669 struct myrb_hba *cb = shost_priv(sdev->host);
1670 struct myrb_pdev_state *pdev_info;
1671 unsigned short status;
1672
1673 if (sdev->id > MYRB_MAX_TARGETS)
1674 return -ENXIO;
1675
1676 pdev_info = kzalloc(sizeof(*pdev_info), GFP_KERNEL|GFP_DMA);
1677 if (!pdev_info)
1678 return -ENOMEM;
1679
1680 status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1681 sdev, pdev_info);
1682 if (status != MYRB_STATUS_SUCCESS) {
1683 dev_dbg(&sdev->sdev_gendev,
1684 "Failed to get device state, status %x\n",
1685 status);
1686 kfree(pdev_info);
1687 return -ENXIO;
1688 }
1689 if (!pdev_info->present) {
1690 dev_dbg(&sdev->sdev_gendev,
1691 "device not present, skip\n");
1692 kfree(pdev_info);
1693 return -ENXIO;
1694 }
1695 dev_dbg(&sdev->sdev_gendev,
1696 "slave alloc pdev %d:%d state %x\n",
1697 sdev->channel, sdev->id, pdev_info->state);
1698 sdev->hostdata = pdev_info;
1699
1700 return 0;
1701}
1702
1703static int myrb_slave_alloc(struct scsi_device *sdev)
1704{
1705 if (sdev->channel > myrb_logical_channel(sdev->host))
1706 return -ENXIO;
1707
1708 if (sdev->lun > 0)
1709 return -ENXIO;
1710
1711 if (sdev->channel == myrb_logical_channel(sdev->host))
1712 return myrb_ldev_slave_alloc(sdev);
1713
1714 return myrb_pdev_slave_alloc(sdev);
1715}
1716
1717static int myrb_slave_configure(struct scsi_device *sdev)
1718{
1719 struct myrb_ldev_info *ldev_info;
1720
1721 if (sdev->channel > myrb_logical_channel(sdev->host))
1722 return -ENXIO;
1723
1724 if (sdev->channel < myrb_logical_channel(sdev->host)) {
1725 sdev->no_uld_attach = 1;
1726 return 0;
1727 }
1728 if (sdev->lun != 0)
1729 return -ENXIO;
1730
1731 ldev_info = sdev->hostdata;
1732 if (!ldev_info)
1733 return -ENXIO;
1734 if (ldev_info->state != MYRB_DEVICE_ONLINE)
1735 sdev_printk(KERN_INFO, sdev,
1736 "Logical drive is %s\n",
1737 myrb_devstate_name(ldev_info->state));
1738
1739 sdev->tagged_supported = 1;
1740 return 0;
1741}
1742
1743static void myrb_slave_destroy(struct scsi_device *sdev)
1744{
1745 kfree(sdev->hostdata);
1746}
1747
1748static int myrb_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1749 sector_t capacity, int geom[])
1750{
1751 struct myrb_hba *cb = shost_priv(sdev->host);
1752
1753 geom[0] = cb->ldev_geom_heads;
1754 geom[1] = cb->ldev_geom_sectors;
1755 geom[2] = sector_div(capacity, geom[0] * geom[1]);
1756
1757 return 0;
1758}
1759
1760static ssize_t raid_state_show(struct device *dev,
1761 struct device_attribute *attr, char *buf)
1762{
1763 struct scsi_device *sdev = to_scsi_device(dev);
1764 struct myrb_hba *cb = shost_priv(sdev->host);
1765 int ret;
1766
1767 if (!sdev->hostdata)
1768 return snprintf(buf, 16, "Unknown\n");
1769
1770 if (sdev->channel == myrb_logical_channel(sdev->host)) {
1771 struct myrb_ldev_info *ldev_info = sdev->hostdata;
1772 const char *name;
1773
1774 name = myrb_devstate_name(ldev_info->state);
1775 if (name)
1776 ret = snprintf(buf, 32, "%s\n", name);
1777 else
1778 ret = snprintf(buf, 32, "Invalid (%02X)\n",
1779 ldev_info->state);
1780 } else {
1781 struct myrb_pdev_state *pdev_info = sdev->hostdata;
1782 unsigned short status;
1783 const char *name;
1784
1785 status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1786 sdev, pdev_info);
1787 if (status != MYRB_STATUS_SUCCESS)
1788 sdev_printk(KERN_INFO, sdev,
1789 "Failed to get device state, status %x\n",
1790 status);
1791
1792 if (!pdev_info->present)
1793 name = "Removed";
1794 else
1795 name = myrb_devstate_name(pdev_info->state);
1796 if (name)
1797 ret = snprintf(buf, 32, "%s\n", name);
1798 else
1799 ret = snprintf(buf, 32, "Invalid (%02X)\n",
1800 pdev_info->state);
1801 }
1802 return ret;
1803}
1804
1805static ssize_t raid_state_store(struct device *dev,
1806 struct device_attribute *attr, const char *buf, size_t count)
1807{
1808 struct scsi_device *sdev = to_scsi_device(dev);
1809 struct myrb_hba *cb = shost_priv(sdev->host);
1810 struct myrb_pdev_state *pdev_info;
1811 enum myrb_devstate new_state;
1812 unsigned short status;
1813
1814 if (!strncmp(buf, "kill", 4) ||
1815 !strncmp(buf, "offline", 7))
1816 new_state = MYRB_DEVICE_DEAD;
1817 else if (!strncmp(buf, "online", 6))
1818 new_state = MYRB_DEVICE_ONLINE;
1819 else if (!strncmp(buf, "standby", 7))
1820 new_state = MYRB_DEVICE_STANDBY;
1821 else
1822 return -EINVAL;
1823
1824 pdev_info = sdev->hostdata;
1825 if (!pdev_info) {
1826 sdev_printk(KERN_INFO, sdev,
1827 "Failed - no physical device information\n");
1828 return -ENXIO;
1829 }
1830 if (!pdev_info->present) {
1831 sdev_printk(KERN_INFO, sdev,
1832 "Failed - device not present\n");
1833 return -ENXIO;
1834 }
1835
1836 if (pdev_info->state == new_state)
1837 return count;
1838
1839 status = myrb_set_pdev_state(cb, sdev, new_state);
1840 switch (status) {
1841 case MYRB_STATUS_SUCCESS:
1842 break;
1843 case MYRB_STATUS_START_DEVICE_FAILED:
1844 sdev_printk(KERN_INFO, sdev,
1845 "Failed - Unable to Start Device\n");
1846 count = -EAGAIN;
1847 break;
1848 case MYRB_STATUS_NO_DEVICE:
1849 sdev_printk(KERN_INFO, sdev,
1850 "Failed - No Device at Address\n");
1851 count = -ENODEV;
1852 break;
1853 case MYRB_STATUS_INVALID_CHANNEL_OR_TARGET:
1854 sdev_printk(KERN_INFO, sdev,
1855 "Failed - Invalid Channel or Target or Modifier\n");
1856 count = -EINVAL;
1857 break;
1858 case MYRB_STATUS_CHANNEL_BUSY:
1859 sdev_printk(KERN_INFO, sdev,
1860 "Failed - Channel Busy\n");
1861 count = -EBUSY;
1862 break;
1863 default:
1864 sdev_printk(KERN_INFO, sdev,
1865 "Failed - Unexpected Status %04X\n", status);
1866 count = -EIO;
1867 break;
1868 }
1869 return count;
1870}
1871static DEVICE_ATTR_RW(raid_state);
1872
1873static ssize_t raid_level_show(struct device *dev,
1874 struct device_attribute *attr, char *buf)
1875{
1876 struct scsi_device *sdev = to_scsi_device(dev);
1877
1878 if (sdev->channel == myrb_logical_channel(sdev->host)) {
1879 struct myrb_ldev_info *ldev_info = sdev->hostdata;
1880 const char *name;
1881
1882 if (!ldev_info)
1883 return -ENXIO;
1884
1885 name = myrb_raidlevel_name(ldev_info->raid_level);
1886 if (!name)
1887 return snprintf(buf, 32, "Invalid (%02X)\n",
1888 ldev_info->state);
1889 return snprintf(buf, 32, "%s\n", name);
1890 }
1891 return snprintf(buf, 32, "Physical Drive\n");
1892}
1893static DEVICE_ATTR_RO(raid_level);
1894
1895static ssize_t rebuild_show(struct device *dev,
1896 struct device_attribute *attr, char *buf)
1897{
1898 struct scsi_device *sdev = to_scsi_device(dev);
1899 struct myrb_hba *cb = shost_priv(sdev->host);
1900 struct myrb_rbld_progress rbld_buf;
1901 unsigned char status;
1902
1903 if (sdev->channel < myrb_logical_channel(sdev->host))
1904 return snprintf(buf, 32, "physical device - not rebuilding\n");
1905
1906 status = myrb_get_rbld_progress(cb, &rbld_buf);
1907
1908 if (rbld_buf.ldev_num != sdev->id ||
1909 status != MYRB_STATUS_SUCCESS)
1910 return snprintf(buf, 32, "not rebuilding\n");
1911
1912 return snprintf(buf, 32, "rebuilding block %u of %u\n",
1913 rbld_buf.ldev_size - rbld_buf.blocks_left,
1914 rbld_buf.ldev_size);
1915}
1916
1917static ssize_t rebuild_store(struct device *dev,
1918 struct device_attribute *attr, const char *buf, size_t count)
1919{
1920 struct scsi_device *sdev = to_scsi_device(dev);
1921 struct myrb_hba *cb = shost_priv(sdev->host);
1922 struct myrb_cmdblk *cmd_blk;
1923 union myrb_cmd_mbox *mbox;
1924 unsigned short status;
1925 int rc, start;
1926 const char *msg;
1927
1928 rc = kstrtoint(buf, 0, &start);
1929 if (rc)
1930 return rc;
1931
1932 if (sdev->channel >= myrb_logical_channel(sdev->host))
1933 return -ENXIO;
1934
1935 status = myrb_get_rbld_progress(cb, NULL);
1936 if (start) {
1937 if (status == MYRB_STATUS_SUCCESS) {
1938 sdev_printk(KERN_INFO, sdev,
1939 "Rebuild Not Initiated; already in progress\n");
1940 return -EALREADY;
1941 }
1942 mutex_lock(&cb->dcmd_mutex);
1943 cmd_blk = &cb->dcmd_blk;
1944 myrb_reset_cmd(cmd_blk);
1945 mbox = &cmd_blk->mbox;
1946 mbox->type3D.opcode = MYRB_CMD_REBUILD_ASYNC;
1947 mbox->type3D.id = MYRB_DCMD_TAG;
1948 mbox->type3D.channel = sdev->channel;
1949 mbox->type3D.target = sdev->id;
1950 status = myrb_exec_cmd(cb, cmd_blk);
1951 mutex_unlock(&cb->dcmd_mutex);
1952 } else {
1953 struct pci_dev *pdev = cb->pdev;
1954 unsigned char *rate;
1955 dma_addr_t rate_addr;
1956
1957 if (status != MYRB_STATUS_SUCCESS) {
1958 sdev_printk(KERN_INFO, sdev,
1959 "Rebuild Not Cancelled; not in progress\n");
1960 return 0;
1961 }
1962
1963 rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
1964 &rate_addr, GFP_KERNEL);
1965 if (rate == NULL) {
1966 sdev_printk(KERN_INFO, sdev,
1967 "Cancellation of Rebuild Failed - Out of Memory\n");
1968 return -ENOMEM;
1969 }
1970 mutex_lock(&cb->dcmd_mutex);
1971 cmd_blk = &cb->dcmd_blk;
1972 myrb_reset_cmd(cmd_blk);
1973 mbox = &cmd_blk->mbox;
1974 mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
1975 mbox->type3R.id = MYRB_DCMD_TAG;
1976 mbox->type3R.rbld_rate = 0xFF;
1977 mbox->type3R.addr = rate_addr;
1978 status = myrb_exec_cmd(cb, cmd_blk);
1979 dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
1980 mutex_unlock(&cb->dcmd_mutex);
1981 }
1982 if (status == MYRB_STATUS_SUCCESS) {
1983 sdev_printk(KERN_INFO, sdev, "Rebuild %s\n",
1984 start ? "Initiated" : "Cancelled");
1985 return count;
1986 }
1987 if (!start) {
1988 sdev_printk(KERN_INFO, sdev,
1989 "Rebuild Not Cancelled, status 0x%x\n",
1990 status);
1991 return -EIO;
1992 }
1993
1994 switch (status) {
1995 case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
1996 msg = "Attempt to Rebuild Online or Unresponsive Drive";
1997 break;
1998 case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
1999 msg = "New Disk Failed During Rebuild";
2000 break;
2001 case MYRB_STATUS_INVALID_ADDRESS:
2002 msg = "Invalid Device Address";
2003 break;
2004 case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2005 msg = "Already in Progress";
2006 break;
2007 default:
2008 msg = NULL;
2009 break;
2010 }
2011 if (msg)
2012 sdev_printk(KERN_INFO, sdev,
2013 "Rebuild Failed - %s\n", msg);
2014 else
2015 sdev_printk(KERN_INFO, sdev,
2016 "Rebuild Failed, status 0x%x\n", status);
2017
2018 return -EIO;
2019}
2020static DEVICE_ATTR_RW(rebuild);
2021
2022static ssize_t consistency_check_store(struct device *dev,
2023 struct device_attribute *attr, const char *buf, size_t count)
2024{
2025 struct scsi_device *sdev = to_scsi_device(dev);
2026 struct myrb_hba *cb = shost_priv(sdev->host);
2027 struct myrb_rbld_progress rbld_buf;
2028 struct myrb_cmdblk *cmd_blk;
2029 union myrb_cmd_mbox *mbox;
2030 unsigned short ldev_num = 0xFFFF;
2031 unsigned short status;
2032 int rc, start;
2033 const char *msg;
2034
2035 rc = kstrtoint(buf, 0, &start);
2036 if (rc)
2037 return rc;
2038
2039 if (sdev->channel < myrb_logical_channel(sdev->host))
2040 return -ENXIO;
2041
2042 status = myrb_get_rbld_progress(cb, &rbld_buf);
2043 if (start) {
2044 if (status == MYRB_STATUS_SUCCESS) {
2045 sdev_printk(KERN_INFO, sdev,
2046 "Check Consistency Not Initiated; already in progress\n");
2047 return -EALREADY;
2048 }
2049 mutex_lock(&cb->dcmd_mutex);
2050 cmd_blk = &cb->dcmd_blk;
2051 myrb_reset_cmd(cmd_blk);
2052 mbox = &cmd_blk->mbox;
2053 mbox->type3C.opcode = MYRB_CMD_CHECK_CONSISTENCY_ASYNC;
2054 mbox->type3C.id = MYRB_DCMD_TAG;
2055 mbox->type3C.ldev_num = sdev->id;
2056 mbox->type3C.auto_restore = true;
2057
2058 status = myrb_exec_cmd(cb, cmd_blk);
2059 mutex_unlock(&cb->dcmd_mutex);
2060 } else {
2061 struct pci_dev *pdev = cb->pdev;
2062 unsigned char *rate;
2063 dma_addr_t rate_addr;
2064
2065 if (ldev_num != sdev->id) {
2066 sdev_printk(KERN_INFO, sdev,
2067 "Check Consistency Not Cancelled; not in progress\n");
2068 return 0;
2069 }
2070 rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
2071 &rate_addr, GFP_KERNEL);
2072 if (rate == NULL) {
2073 sdev_printk(KERN_INFO, sdev,
2074 "Cancellation of Check Consistency Failed - Out of Memory\n");
2075 return -ENOMEM;
2076 }
2077 mutex_lock(&cb->dcmd_mutex);
2078 cmd_blk = &cb->dcmd_blk;
2079 myrb_reset_cmd(cmd_blk);
2080 mbox = &cmd_blk->mbox;
2081 mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
2082 mbox->type3R.id = MYRB_DCMD_TAG;
2083 mbox->type3R.rbld_rate = 0xFF;
2084 mbox->type3R.addr = rate_addr;
2085 status = myrb_exec_cmd(cb, cmd_blk);
2086 dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
2087 mutex_unlock(&cb->dcmd_mutex);
2088 }
2089 if (status == MYRB_STATUS_SUCCESS) {
2090 sdev_printk(KERN_INFO, sdev, "Check Consistency %s\n",
2091 start ? "Initiated" : "Cancelled");
2092 return count;
2093 }
2094 if (!start) {
2095 sdev_printk(KERN_INFO, sdev,
2096 "Check Consistency Not Cancelled, status 0x%x\n",
2097 status);
2098 return -EIO;
2099 }
2100
2101 switch (status) {
2102 case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
2103 msg = "Dependent Physical Device is DEAD";
2104 break;
2105 case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
2106 msg = "New Disk Failed During Rebuild";
2107 break;
2108 case MYRB_STATUS_INVALID_ADDRESS:
2109 msg = "Invalid or Nonredundant Logical Drive";
2110 break;
2111 case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2112 msg = "Already in Progress";
2113 break;
2114 default:
2115 msg = NULL;
2116 break;
2117 }
2118 if (msg)
2119 sdev_printk(KERN_INFO, sdev,
2120 "Check Consistency Failed - %s\n", msg);
2121 else
2122 sdev_printk(KERN_INFO, sdev,
2123 "Check Consistency Failed, status 0x%x\n", status);
2124
2125 return -EIO;
2126}
2127
2128static ssize_t consistency_check_show(struct device *dev,
2129 struct device_attribute *attr, char *buf)
2130{
2131 return rebuild_show(dev, attr, buf);
2132}
2133static DEVICE_ATTR_RW(consistency_check);
2134
2135static ssize_t ctlr_num_show(struct device *dev,
2136 struct device_attribute *attr, char *buf)
2137{
2138 struct Scsi_Host *shost = class_to_shost(dev);
2139 struct myrb_hba *cb = shost_priv(shost);
2140
Ye Binfc29f042020-09-30 10:16:37 +08002141 return snprintf(buf, 20, "%u\n", cb->ctlr_num);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002142}
2143static DEVICE_ATTR_RO(ctlr_num);
2144
2145static ssize_t firmware_show(struct device *dev,
2146 struct device_attribute *attr, char *buf)
2147{
2148 struct Scsi_Host *shost = class_to_shost(dev);
2149 struct myrb_hba *cb = shost_priv(shost);
2150
2151 return snprintf(buf, 16, "%s\n", cb->fw_version);
2152}
2153static DEVICE_ATTR_RO(firmware);
2154
2155static ssize_t model_show(struct device *dev,
2156 struct device_attribute *attr, char *buf)
2157{
2158 struct Scsi_Host *shost = class_to_shost(dev);
2159 struct myrb_hba *cb = shost_priv(shost);
2160
2161 return snprintf(buf, 16, "%s\n", cb->model_name);
2162}
2163static DEVICE_ATTR_RO(model);
2164
2165static ssize_t flush_cache_store(struct device *dev,
2166 struct device_attribute *attr, const char *buf, size_t count)
2167{
2168 struct Scsi_Host *shost = class_to_shost(dev);
2169 struct myrb_hba *cb = shost_priv(shost);
2170 unsigned short status;
2171
2172 status = myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
2173 if (status == MYRB_STATUS_SUCCESS) {
2174 shost_printk(KERN_INFO, shost,
2175 "Cache Flush Completed\n");
2176 return count;
2177 }
2178 shost_printk(KERN_INFO, shost,
2179 "Cache Flush Failed, status %x\n", status);
2180 return -EIO;
2181}
2182static DEVICE_ATTR_WO(flush_cache);
2183
2184static struct device_attribute *myrb_sdev_attrs[] = {
2185 &dev_attr_rebuild,
2186 &dev_attr_consistency_check,
2187 &dev_attr_raid_state,
2188 &dev_attr_raid_level,
2189 NULL,
2190};
2191
2192static struct device_attribute *myrb_shost_attrs[] = {
2193 &dev_attr_ctlr_num,
2194 &dev_attr_model,
2195 &dev_attr_firmware,
2196 &dev_attr_flush_cache,
2197 NULL,
2198};
2199
Jason Yan9d8a5512020-09-15 16:40:18 +08002200static struct scsi_host_template myrb_template = {
Hannes Reinecke081ff392018-10-17 17:25:11 +02002201 .module = THIS_MODULE,
2202 .name = "DAC960",
2203 .proc_name = "myrb",
2204 .queuecommand = myrb_queuecommand,
2205 .eh_host_reset_handler = myrb_host_reset,
2206 .slave_alloc = myrb_slave_alloc,
2207 .slave_configure = myrb_slave_configure,
2208 .slave_destroy = myrb_slave_destroy,
2209 .bios_param = myrb_biosparam,
2210 .cmd_size = sizeof(struct myrb_cmdblk),
2211 .shost_attrs = myrb_shost_attrs,
2212 .sdev_attrs = myrb_sdev_attrs,
2213 .this_id = -1,
2214};
2215
2216/**
2217 * myrb_is_raid - return boolean indicating device is raid volume
Lee Jones12a1b742021-03-17 09:11:55 +00002218 * @dev: the device struct object
Hannes Reinecke081ff392018-10-17 17:25:11 +02002219 */
2220static int myrb_is_raid(struct device *dev)
2221{
2222 struct scsi_device *sdev = to_scsi_device(dev);
2223
2224 return sdev->channel == myrb_logical_channel(sdev->host);
2225}
2226
2227/**
2228 * myrb_get_resync - get raid volume resync percent complete
Lee Jones12a1b742021-03-17 09:11:55 +00002229 * @dev: the device struct object
Hannes Reinecke081ff392018-10-17 17:25:11 +02002230 */
2231static void myrb_get_resync(struct device *dev)
2232{
2233 struct scsi_device *sdev = to_scsi_device(dev);
2234 struct myrb_hba *cb = shost_priv(sdev->host);
2235 struct myrb_rbld_progress rbld_buf;
2236 unsigned int percent_complete = 0;
2237 unsigned short status;
2238 unsigned int ldev_size = 0, remaining = 0;
2239
2240 if (sdev->channel < myrb_logical_channel(sdev->host))
2241 return;
2242 status = myrb_get_rbld_progress(cb, &rbld_buf);
2243 if (status == MYRB_STATUS_SUCCESS) {
2244 if (rbld_buf.ldev_num == sdev->id) {
2245 ldev_size = rbld_buf.ldev_size;
2246 remaining = rbld_buf.blocks_left;
2247 }
2248 }
2249 if (remaining && ldev_size)
2250 percent_complete = (ldev_size - remaining) * 100 / ldev_size;
2251 raid_set_resync(myrb_raid_template, dev, percent_complete);
2252}
2253
2254/**
2255 * myrb_get_state - get raid volume status
Lee Jones12a1b742021-03-17 09:11:55 +00002256 * @dev: the device struct object
Hannes Reinecke081ff392018-10-17 17:25:11 +02002257 */
2258static void myrb_get_state(struct device *dev)
2259{
2260 struct scsi_device *sdev = to_scsi_device(dev);
2261 struct myrb_hba *cb = shost_priv(sdev->host);
2262 struct myrb_ldev_info *ldev_info = sdev->hostdata;
2263 enum raid_state state = RAID_STATE_UNKNOWN;
2264 unsigned short status;
2265
2266 if (sdev->channel < myrb_logical_channel(sdev->host) || !ldev_info)
2267 state = RAID_STATE_UNKNOWN;
2268 else {
2269 status = myrb_get_rbld_progress(cb, NULL);
2270 if (status == MYRB_STATUS_SUCCESS)
2271 state = RAID_STATE_RESYNCING;
2272 else {
2273 switch (ldev_info->state) {
2274 case MYRB_DEVICE_ONLINE:
2275 state = RAID_STATE_ACTIVE;
2276 break;
2277 case MYRB_DEVICE_WO:
2278 case MYRB_DEVICE_CRITICAL:
2279 state = RAID_STATE_DEGRADED;
2280 break;
2281 default:
2282 state = RAID_STATE_OFFLINE;
2283 }
2284 }
2285 }
2286 raid_set_state(myrb_raid_template, dev, state);
2287}
2288
Jason Yan9d8a5512020-09-15 16:40:18 +08002289static struct raid_function_template myrb_raid_functions = {
Hannes Reinecke081ff392018-10-17 17:25:11 +02002290 .cookie = &myrb_template,
2291 .is_raid = myrb_is_raid,
2292 .get_resync = myrb_get_resync,
2293 .get_state = myrb_get_state,
2294};
2295
2296static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk,
2297 struct scsi_cmnd *scmd)
2298{
2299 unsigned short status;
2300
2301 if (!cmd_blk)
2302 return;
2303
2304 scsi_dma_unmap(scmd);
2305
2306 if (cmd_blk->dcdb) {
2307 memcpy(scmd->sense_buffer, &cmd_blk->dcdb->sense, 64);
2308 dma_pool_free(cb->dcdb_pool, cmd_blk->dcdb,
2309 cmd_blk->dcdb_addr);
2310 cmd_blk->dcdb = NULL;
2311 }
2312 if (cmd_blk->sgl) {
2313 dma_pool_free(cb->sg_pool, cmd_blk->sgl, cmd_blk->sgl_addr);
2314 cmd_blk->sgl = NULL;
2315 cmd_blk->sgl_addr = 0;
2316 }
2317 status = cmd_blk->status;
2318 switch (status) {
2319 case MYRB_STATUS_SUCCESS:
2320 case MYRB_STATUS_DEVICE_BUSY:
2321 scmd->result = (DID_OK << 16) | status;
2322 break;
2323 case MYRB_STATUS_BAD_DATA:
2324 dev_dbg(&scmd->device->sdev_gendev,
2325 "Bad Data Encountered\n");
2326 if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2327 /* Unrecovered read error */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02002328 scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x11, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002329 else
2330 /* Write error */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02002331 scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x0C, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002332 break;
2333 case MYRB_STATUS_IRRECOVERABLE_DATA_ERROR:
2334 scmd_printk(KERN_ERR, scmd, "Irrecoverable Data Error\n");
2335 if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2336 /* Unrecovered read error, auto-reallocation failed */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02002337 scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x11, 0x04);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002338 else
2339 /* Write error, auto-reallocation failed */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02002340 scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x0C, 0x02);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002341 break;
2342 case MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE:
2343 dev_dbg(&scmd->device->sdev_gendev,
2344 "Logical Drive Nonexistent or Offline");
2345 scmd->result = (DID_BAD_TARGET << 16);
2346 break;
2347 case MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV:
2348 dev_dbg(&scmd->device->sdev_gendev,
2349 "Attempt to Access Beyond End of Logical Drive");
2350 /* Logical block address out of range */
Hannes Reineckef2b1e9c2021-04-27 10:30:13 +02002351 scsi_build_sense(scmd, 0, NOT_READY, 0x21, 0);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002352 break;
2353 case MYRB_STATUS_DEVICE_NONRESPONSIVE:
2354 dev_dbg(&scmd->device->sdev_gendev, "Device nonresponsive\n");
2355 scmd->result = (DID_BAD_TARGET << 16);
2356 break;
2357 default:
2358 scmd_printk(KERN_ERR, scmd,
2359 "Unexpected Error Status %04X", status);
2360 scmd->result = (DID_ERROR << 16);
2361 break;
2362 }
2363 scmd->scsi_done(scmd);
2364}
2365
2366static void myrb_handle_cmdblk(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
2367{
2368 if (!cmd_blk)
2369 return;
2370
2371 if (cmd_blk->completion) {
2372 complete(cmd_blk->completion);
2373 cmd_blk->completion = NULL;
2374 }
2375}
2376
2377static void myrb_monitor(struct work_struct *work)
2378{
2379 struct myrb_hba *cb = container_of(work,
2380 struct myrb_hba, monitor_work.work);
2381 struct Scsi_Host *shost = cb->host;
2382 unsigned long interval = MYRB_PRIMARY_MONITOR_INTERVAL;
2383
2384 dev_dbg(&shost->shost_gendev, "monitor tick\n");
2385
2386 if (cb->new_ev_seq > cb->old_ev_seq) {
2387 int event = cb->old_ev_seq;
2388
2389 dev_dbg(&shost->shost_gendev,
2390 "get event log no %d/%d\n",
2391 cb->new_ev_seq, event);
2392 myrb_get_event(cb, event);
2393 cb->old_ev_seq = event + 1;
2394 interval = 10;
2395 } else if (cb->need_err_info) {
2396 cb->need_err_info = false;
2397 dev_dbg(&shost->shost_gendev, "get error table\n");
2398 myrb_get_errtable(cb);
2399 interval = 10;
2400 } else if (cb->need_rbld && cb->rbld_first) {
2401 cb->need_rbld = false;
2402 dev_dbg(&shost->shost_gendev,
2403 "get rebuild progress\n");
2404 myrb_update_rbld_progress(cb);
2405 interval = 10;
2406 } else if (cb->need_ldev_info) {
2407 cb->need_ldev_info = false;
2408 dev_dbg(&shost->shost_gendev,
2409 "get logical drive info\n");
2410 myrb_get_ldev_info(cb);
2411 interval = 10;
2412 } else if (cb->need_rbld) {
2413 cb->need_rbld = false;
2414 dev_dbg(&shost->shost_gendev,
2415 "get rebuild progress\n");
2416 myrb_update_rbld_progress(cb);
2417 interval = 10;
2418 } else if (cb->need_cc_status) {
2419 cb->need_cc_status = false;
2420 dev_dbg(&shost->shost_gendev,
2421 "get consistency check progress\n");
2422 myrb_get_cc_progress(cb);
2423 interval = 10;
2424 } else if (cb->need_bgi_status) {
2425 cb->need_bgi_status = false;
2426 dev_dbg(&shost->shost_gendev, "get background init status\n");
2427 myrb_bgi_control(cb);
2428 interval = 10;
2429 } else {
2430 dev_dbg(&shost->shost_gendev, "new enquiry\n");
2431 mutex_lock(&cb->dma_mutex);
2432 myrb_hba_enquiry(cb);
2433 mutex_unlock(&cb->dma_mutex);
2434 if ((cb->new_ev_seq - cb->old_ev_seq > 0) ||
2435 cb->need_err_info || cb->need_rbld ||
2436 cb->need_ldev_info || cb->need_cc_status ||
2437 cb->need_bgi_status) {
2438 dev_dbg(&shost->shost_gendev,
2439 "reschedule monitor\n");
2440 interval = 0;
2441 }
2442 }
2443 if (interval > 1)
2444 cb->primary_monitor_time = jiffies;
2445 queue_delayed_work(cb->work_q, &cb->monitor_work, interval);
2446}
2447
Lee Jones12a1b742021-03-17 09:11:55 +00002448/*
Hannes Reinecke081ff392018-10-17 17:25:11 +02002449 * myrb_err_status - reports controller BIOS messages
2450 *
2451 * Controller BIOS messages are passed through the Error Status Register
2452 * when the driver performs the BIOS handshaking.
2453 *
2454 * Return: true for fatal errors and false otherwise.
2455 */
Jason Yan9d8a5512020-09-15 16:40:18 +08002456static bool myrb_err_status(struct myrb_hba *cb, unsigned char error,
Hannes Reinecke081ff392018-10-17 17:25:11 +02002457 unsigned char parm0, unsigned char parm1)
2458{
2459 struct pci_dev *pdev = cb->pdev;
2460
2461 switch (error) {
2462 case 0x00:
2463 dev_info(&pdev->dev,
2464 "Physical Device %d:%d Not Responding\n",
2465 parm1, parm0);
2466 break;
2467 case 0x08:
2468 dev_notice(&pdev->dev, "Spinning Up Drives\n");
2469 break;
2470 case 0x30:
2471 dev_notice(&pdev->dev, "Configuration Checksum Error\n");
2472 break;
2473 case 0x60:
2474 dev_notice(&pdev->dev, "Mirror Race Recovery Failed\n");
2475 break;
2476 case 0x70:
2477 dev_notice(&pdev->dev, "Mirror Race Recovery In Progress\n");
2478 break;
2479 case 0x90:
2480 dev_notice(&pdev->dev, "Physical Device %d:%d COD Mismatch\n",
2481 parm1, parm0);
2482 break;
2483 case 0xA0:
2484 dev_notice(&pdev->dev, "Logical Drive Installation Aborted\n");
2485 break;
2486 case 0xB0:
2487 dev_notice(&pdev->dev, "Mirror Race On A Critical Logical Drive\n");
2488 break;
2489 case 0xD0:
2490 dev_notice(&pdev->dev, "New Controller Configuration Found\n");
2491 break;
2492 case 0xF0:
2493 dev_err(&pdev->dev, "Fatal Memory Parity Error\n");
2494 return true;
2495 default:
2496 dev_err(&pdev->dev, "Unknown Initialization Error %02X\n",
2497 error);
2498 return true;
2499 }
2500 return false;
2501}
2502
2503/*
2504 * Hardware-specific functions
2505 */
2506
2507/*
2508 * DAC960 LA Series Controllers
2509 */
2510
2511static inline void DAC960_LA_hw_mbox_new_cmd(void __iomem *base)
2512{
2513 writeb(DAC960_LA_IDB_HWMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2514}
2515
2516static inline void DAC960_LA_ack_hw_mbox_status(void __iomem *base)
2517{
2518 writeb(DAC960_LA_IDB_HWMBOX_ACK_STS, base + DAC960_LA_IDB_OFFSET);
2519}
2520
Hannes Reinecke081ff392018-10-17 17:25:11 +02002521static inline void DAC960_LA_reset_ctrl(void __iomem *base)
2522{
2523 writeb(DAC960_LA_IDB_CTRL_RESET, base + DAC960_LA_IDB_OFFSET);
2524}
2525
2526static inline void DAC960_LA_mem_mbox_new_cmd(void __iomem *base)
2527{
2528 writeb(DAC960_LA_IDB_MMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2529}
2530
2531static inline bool DAC960_LA_hw_mbox_is_full(void __iomem *base)
2532{
2533 unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2534
2535 return !(idb & DAC960_LA_IDB_HWMBOX_EMPTY);
2536}
2537
2538static inline bool DAC960_LA_init_in_progress(void __iomem *base)
2539{
2540 unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2541
2542 return !(idb & DAC960_LA_IDB_INIT_DONE);
2543}
2544
2545static inline void DAC960_LA_ack_hw_mbox_intr(void __iomem *base)
2546{
2547 writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET);
2548}
2549
Hannes Reinecke081ff392018-10-17 17:25:11 +02002550static inline void DAC960_LA_ack_intr(void __iomem *base)
2551{
2552 writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ | DAC960_LA_ODB_MMBOX_ACK_IRQ,
2553 base + DAC960_LA_ODB_OFFSET);
2554}
2555
2556static inline bool DAC960_LA_hw_mbox_status_available(void __iomem *base)
2557{
2558 unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET);
2559
2560 return odb & DAC960_LA_ODB_HWMBOX_STS_AVAIL;
2561}
2562
Hannes Reinecke081ff392018-10-17 17:25:11 +02002563static inline void DAC960_LA_enable_intr(void __iomem *base)
2564{
2565 unsigned char odb = 0xFF;
2566
2567 odb &= ~DAC960_LA_IRQMASK_DISABLE_IRQ;
2568 writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2569}
2570
2571static inline void DAC960_LA_disable_intr(void __iomem *base)
2572{
2573 unsigned char odb = 0xFF;
2574
2575 odb |= DAC960_LA_IRQMASK_DISABLE_IRQ;
2576 writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2577}
2578
Hannes Reinecke081ff392018-10-17 17:25:11 +02002579static inline void DAC960_LA_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2580 union myrb_cmd_mbox *mbox)
2581{
2582 mem_mbox->words[1] = mbox->words[1];
2583 mem_mbox->words[2] = mbox->words[2];
2584 mem_mbox->words[3] = mbox->words[3];
2585 /* Memory barrier to prevent reordering */
2586 wmb();
2587 mem_mbox->words[0] = mbox->words[0];
2588 /* Memory barrier to force PCI access */
2589 mb();
2590}
2591
2592static inline void DAC960_LA_write_hw_mbox(void __iomem *base,
2593 union myrb_cmd_mbox *mbox)
2594{
2595 writel(mbox->words[0], base + DAC960_LA_CMDOP_OFFSET);
2596 writel(mbox->words[1], base + DAC960_LA_MBOX4_OFFSET);
2597 writel(mbox->words[2], base + DAC960_LA_MBOX8_OFFSET);
2598 writeb(mbox->bytes[12], base + DAC960_LA_MBOX12_OFFSET);
2599}
2600
Hannes Reinecke081ff392018-10-17 17:25:11 +02002601static inline unsigned short DAC960_LA_read_status(void __iomem *base)
2602{
2603 return readw(base + DAC960_LA_STS_OFFSET);
2604}
2605
2606static inline bool
2607DAC960_LA_read_error_status(void __iomem *base, unsigned char *error,
2608 unsigned char *param0, unsigned char *param1)
2609{
2610 unsigned char errsts = readb(base + DAC960_LA_ERRSTS_OFFSET);
2611
2612 if (!(errsts & DAC960_LA_ERRSTS_PENDING))
2613 return false;
2614 errsts &= ~DAC960_LA_ERRSTS_PENDING;
2615
2616 *error = errsts;
2617 *param0 = readb(base + DAC960_LA_CMDOP_OFFSET);
2618 *param1 = readb(base + DAC960_LA_CMDID_OFFSET);
2619 writeb(0xFF, base + DAC960_LA_ERRSTS_OFFSET);
2620 return true;
2621}
2622
2623static inline unsigned short
2624DAC960_LA_mbox_init(struct pci_dev *pdev, void __iomem *base,
2625 union myrb_cmd_mbox *mbox)
2626{
2627 unsigned short status;
2628 int timeout = 0;
2629
2630 while (timeout < MYRB_MAILBOX_TIMEOUT) {
2631 if (!DAC960_LA_hw_mbox_is_full(base))
2632 break;
2633 udelay(10);
2634 timeout++;
2635 }
2636 if (DAC960_LA_hw_mbox_is_full(base)) {
2637 dev_err(&pdev->dev,
2638 "Timeout waiting for empty mailbox\n");
2639 return MYRB_STATUS_SUBSYS_TIMEOUT;
2640 }
2641 DAC960_LA_write_hw_mbox(base, mbox);
2642 DAC960_LA_hw_mbox_new_cmd(base);
2643 timeout = 0;
2644 while (timeout < MYRB_MAILBOX_TIMEOUT) {
2645 if (DAC960_LA_hw_mbox_status_available(base))
2646 break;
2647 udelay(10);
2648 timeout++;
2649 }
2650 if (!DAC960_LA_hw_mbox_status_available(base)) {
2651 dev_err(&pdev->dev, "Timeout waiting for mailbox status\n");
2652 return MYRB_STATUS_SUBSYS_TIMEOUT;
2653 }
2654 status = DAC960_LA_read_status(base);
2655 DAC960_LA_ack_hw_mbox_intr(base);
2656 DAC960_LA_ack_hw_mbox_status(base);
2657
2658 return status;
2659}
2660
2661static int DAC960_LA_hw_init(struct pci_dev *pdev,
2662 struct myrb_hba *cb, void __iomem *base)
2663{
2664 int timeout = 0;
2665 unsigned char error, parm0, parm1;
2666
2667 DAC960_LA_disable_intr(base);
2668 DAC960_LA_ack_hw_mbox_status(base);
2669 udelay(1000);
Hannes Reinecke081ff392018-10-17 17:25:11 +02002670 while (DAC960_LA_init_in_progress(base) &&
2671 timeout < MYRB_MAILBOX_TIMEOUT) {
2672 if (DAC960_LA_read_error_status(base, &error,
2673 &parm0, &parm1) &&
2674 myrb_err_status(cb, error, parm0, parm1))
2675 return -ENODEV;
2676 udelay(10);
2677 timeout++;
2678 }
2679 if (timeout == MYRB_MAILBOX_TIMEOUT) {
2680 dev_err(&pdev->dev,
2681 "Timeout waiting for Controller Initialisation\n");
2682 return -ETIMEDOUT;
2683 }
2684 if (!myrb_enable_mmio(cb, DAC960_LA_mbox_init)) {
2685 dev_err(&pdev->dev,
2686 "Unable to Enable Memory Mailbox Interface\n");
2687 DAC960_LA_reset_ctrl(base);
2688 return -ENODEV;
2689 }
2690 DAC960_LA_enable_intr(base);
2691 cb->qcmd = myrb_qcmd;
2692 cb->write_cmd_mbox = DAC960_LA_write_cmd_mbox;
2693 if (cb->dual_mode_interface)
2694 cb->get_cmd_mbox = DAC960_LA_mem_mbox_new_cmd;
2695 else
2696 cb->get_cmd_mbox = DAC960_LA_hw_mbox_new_cmd;
2697 cb->disable_intr = DAC960_LA_disable_intr;
2698 cb->reset = DAC960_LA_reset_ctrl;
2699
2700 return 0;
2701}
2702
2703static irqreturn_t DAC960_LA_intr_handler(int irq, void *arg)
2704{
2705 struct myrb_hba *cb = arg;
2706 void __iomem *base = cb->io_base;
2707 struct myrb_stat_mbox *next_stat_mbox;
2708 unsigned long flags;
2709
2710 spin_lock_irqsave(&cb->queue_lock, flags);
2711 DAC960_LA_ack_intr(base);
2712 next_stat_mbox = cb->next_stat_mbox;
2713 while (next_stat_mbox->valid) {
2714 unsigned char id = next_stat_mbox->id;
2715 struct scsi_cmnd *scmd = NULL;
2716 struct myrb_cmdblk *cmd_blk = NULL;
2717
2718 if (id == MYRB_DCMD_TAG)
2719 cmd_blk = &cb->dcmd_blk;
2720 else if (id == MYRB_MCMD_TAG)
2721 cmd_blk = &cb->mcmd_blk;
2722 else {
2723 scmd = scsi_host_find_tag(cb->host, id - 3);
2724 if (scmd)
2725 cmd_blk = scsi_cmd_priv(scmd);
2726 }
2727 if (cmd_blk)
2728 cmd_blk->status = next_stat_mbox->status;
2729 else
2730 dev_err(&cb->pdev->dev,
2731 "Unhandled command completion %d\n", id);
2732
2733 memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
2734 if (++next_stat_mbox > cb->last_stat_mbox)
2735 next_stat_mbox = cb->first_stat_mbox;
2736
2737 if (cmd_blk) {
2738 if (id < 3)
2739 myrb_handle_cmdblk(cb, cmd_blk);
2740 else
2741 myrb_handle_scsi(cb, cmd_blk, scmd);
2742 }
2743 }
2744 cb->next_stat_mbox = next_stat_mbox;
2745 spin_unlock_irqrestore(&cb->queue_lock, flags);
2746 return IRQ_HANDLED;
2747}
2748
Shixin Liu182ad872021-03-27 15:31:56 +08002749static struct myrb_privdata DAC960_LA_privdata = {
Hannes Reinecke081ff392018-10-17 17:25:11 +02002750 .hw_init = DAC960_LA_hw_init,
2751 .irq_handler = DAC960_LA_intr_handler,
2752 .mmio_size = DAC960_LA_mmio_size,
2753};
2754
2755/*
2756 * DAC960 PG Series Controllers
2757 */
2758static inline void DAC960_PG_hw_mbox_new_cmd(void __iomem *base)
2759{
2760 writel(DAC960_PG_IDB_HWMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2761}
2762
2763static inline void DAC960_PG_ack_hw_mbox_status(void __iomem *base)
2764{
2765 writel(DAC960_PG_IDB_HWMBOX_ACK_STS, base + DAC960_PG_IDB_OFFSET);
2766}
2767
Hannes Reinecke081ff392018-10-17 17:25:11 +02002768static inline void DAC960_PG_reset_ctrl(void __iomem *base)
2769{
2770 writel(DAC960_PG_IDB_CTRL_RESET, base + DAC960_PG_IDB_OFFSET);
2771}
2772
2773static inline void DAC960_PG_mem_mbox_new_cmd(void __iomem *base)
2774{
2775 writel(DAC960_PG_IDB_MMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2776}
2777
2778static inline bool DAC960_PG_hw_mbox_is_full(void __iomem *base)
2779{
2780 unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2781
2782 return idb & DAC960_PG_IDB_HWMBOX_FULL;
2783}
2784
2785static inline bool DAC960_PG_init_in_progress(void __iomem *base)
2786{
2787 unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2788
2789 return idb & DAC960_PG_IDB_INIT_IN_PROGRESS;
2790}
2791
2792static inline void DAC960_PG_ack_hw_mbox_intr(void __iomem *base)
2793{
2794 writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET);
2795}
2796
Hannes Reinecke081ff392018-10-17 17:25:11 +02002797static inline void DAC960_PG_ack_intr(void __iomem *base)
2798{
2799 writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ | DAC960_PG_ODB_MMBOX_ACK_IRQ,
2800 base + DAC960_PG_ODB_OFFSET);
2801}
2802
2803static inline bool DAC960_PG_hw_mbox_status_available(void __iomem *base)
2804{
2805 unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET);
2806
2807 return odb & DAC960_PG_ODB_HWMBOX_STS_AVAIL;
2808}
2809
Hannes Reinecke081ff392018-10-17 17:25:11 +02002810static inline void DAC960_PG_enable_intr(void __iomem *base)
2811{
2812 unsigned int imask = (unsigned int)-1;
2813
2814 imask &= ~DAC960_PG_IRQMASK_DISABLE_IRQ;
2815 writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2816}
2817
2818static inline void DAC960_PG_disable_intr(void __iomem *base)
2819{
2820 unsigned int imask = (unsigned int)-1;
2821
2822 writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2823}
2824
Hannes Reinecke081ff392018-10-17 17:25:11 +02002825static inline void DAC960_PG_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2826 union myrb_cmd_mbox *mbox)
2827{
2828 mem_mbox->words[1] = mbox->words[1];
2829 mem_mbox->words[2] = mbox->words[2];
2830 mem_mbox->words[3] = mbox->words[3];
2831 /* Memory barrier to prevent reordering */
2832 wmb();
2833 mem_mbox->words[0] = mbox->words[0];
2834 /* Memory barrier to force PCI access */
2835 mb();
2836}
2837
2838static inline void DAC960_PG_write_hw_mbox(void __iomem *base,
2839 union myrb_cmd_mbox *mbox)
2840{
2841 writel(mbox->words[0], base + DAC960_PG_CMDOP_OFFSET);
2842 writel(mbox->words[1], base + DAC960_PG_MBOX4_OFFSET);
2843 writel(mbox->words[2], base + DAC960_PG_MBOX8_OFFSET);
2844 writeb(mbox->bytes[12], base + DAC960_PG_MBOX12_OFFSET);
2845}
2846
Hannes Reinecke081ff392018-10-17 17:25:11 +02002847static inline unsigned short
2848DAC960_PG_read_status(void __iomem *base)
2849{
2850 return readw(base + DAC960_PG_STS_OFFSET);
2851}
2852
2853static inline bool
2854DAC960_PG_read_error_status(void __iomem *base, unsigned char *error,
2855 unsigned char *param0, unsigned char *param1)
2856{
2857 unsigned char errsts = readb(base + DAC960_PG_ERRSTS_OFFSET);
2858
2859 if (!(errsts & DAC960_PG_ERRSTS_PENDING))
2860 return false;
2861 errsts &= ~DAC960_PG_ERRSTS_PENDING;
2862 *error = errsts;
2863 *param0 = readb(base + DAC960_PG_CMDOP_OFFSET);
2864 *param1 = readb(base + DAC960_PG_CMDID_OFFSET);
2865 writeb(0, base + DAC960_PG_ERRSTS_OFFSET);
2866 return true;
2867}
2868
2869static inline unsigned short
2870DAC960_PG_mbox_init(struct pci_dev *pdev, void __iomem *base,
2871 union myrb_cmd_mbox *mbox)
2872{
2873 unsigned short status;
2874 int timeout = 0;
2875
2876 while (timeout < MYRB_MAILBOX_TIMEOUT) {
2877 if (!DAC960_PG_hw_mbox_is_full(base))
2878 break;
2879 udelay(10);
2880 timeout++;
2881 }
2882 if (DAC960_PG_hw_mbox_is_full(base)) {
2883 dev_err(&pdev->dev,
2884 "Timeout waiting for empty mailbox\n");
2885 return MYRB_STATUS_SUBSYS_TIMEOUT;
2886 }
2887 DAC960_PG_write_hw_mbox(base, mbox);
2888 DAC960_PG_hw_mbox_new_cmd(base);
2889
2890 timeout = 0;
2891 while (timeout < MYRB_MAILBOX_TIMEOUT) {
2892 if (DAC960_PG_hw_mbox_status_available(base))
2893 break;
2894 udelay(10);
2895 timeout++;
2896 }
2897 if (!DAC960_PG_hw_mbox_status_available(base)) {
2898 dev_err(&pdev->dev,
2899 "Timeout waiting for mailbox status\n");
2900 return MYRB_STATUS_SUBSYS_TIMEOUT;
2901 }
2902 status = DAC960_PG_read_status(base);
2903 DAC960_PG_ack_hw_mbox_intr(base);
2904 DAC960_PG_ack_hw_mbox_status(base);
2905
2906 return status;
2907}
2908
2909static int DAC960_PG_hw_init(struct pci_dev *pdev,
2910 struct myrb_hba *cb, void __iomem *base)
2911{
2912 int timeout = 0;
2913 unsigned char error, parm0, parm1;
2914
2915 DAC960_PG_disable_intr(base);
2916 DAC960_PG_ack_hw_mbox_status(base);
2917 udelay(1000);
2918 while (DAC960_PG_init_in_progress(base) &&
2919 timeout < MYRB_MAILBOX_TIMEOUT) {
2920 if (DAC960_PG_read_error_status(base, &error,
2921 &parm0, &parm1) &&
2922 myrb_err_status(cb, error, parm0, parm1))
2923 return -EIO;
2924 udelay(10);
2925 timeout++;
2926 }
2927 if (timeout == MYRB_MAILBOX_TIMEOUT) {
2928 dev_err(&pdev->dev,
2929 "Timeout waiting for Controller Initialisation\n");
2930 return -ETIMEDOUT;
2931 }
2932 if (!myrb_enable_mmio(cb, DAC960_PG_mbox_init)) {
2933 dev_err(&pdev->dev,
2934 "Unable to Enable Memory Mailbox Interface\n");
2935 DAC960_PG_reset_ctrl(base);
2936 return -ENODEV;
2937 }
2938 DAC960_PG_enable_intr(base);
2939 cb->qcmd = myrb_qcmd;
2940 cb->write_cmd_mbox = DAC960_PG_write_cmd_mbox;
2941 if (cb->dual_mode_interface)
2942 cb->get_cmd_mbox = DAC960_PG_mem_mbox_new_cmd;
2943 else
2944 cb->get_cmd_mbox = DAC960_PG_hw_mbox_new_cmd;
2945 cb->disable_intr = DAC960_PG_disable_intr;
2946 cb->reset = DAC960_PG_reset_ctrl;
2947
2948 return 0;
2949}
2950
2951static irqreturn_t DAC960_PG_intr_handler(int irq, void *arg)
2952{
2953 struct myrb_hba *cb = arg;
2954 void __iomem *base = cb->io_base;
2955 struct myrb_stat_mbox *next_stat_mbox;
2956 unsigned long flags;
2957
2958 spin_lock_irqsave(&cb->queue_lock, flags);
2959 DAC960_PG_ack_intr(base);
2960 next_stat_mbox = cb->next_stat_mbox;
2961 while (next_stat_mbox->valid) {
2962 unsigned char id = next_stat_mbox->id;
2963 struct scsi_cmnd *scmd = NULL;
2964 struct myrb_cmdblk *cmd_blk = NULL;
2965
2966 if (id == MYRB_DCMD_TAG)
2967 cmd_blk = &cb->dcmd_blk;
2968 else if (id == MYRB_MCMD_TAG)
2969 cmd_blk = &cb->mcmd_blk;
2970 else {
2971 scmd = scsi_host_find_tag(cb->host, id - 3);
2972 if (scmd)
2973 cmd_blk = scsi_cmd_priv(scmd);
2974 }
2975 if (cmd_blk)
2976 cmd_blk->status = next_stat_mbox->status;
2977 else
2978 dev_err(&cb->pdev->dev,
2979 "Unhandled command completion %d\n", id);
2980
2981 memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
2982 if (++next_stat_mbox > cb->last_stat_mbox)
2983 next_stat_mbox = cb->first_stat_mbox;
2984
2985 if (id < 3)
2986 myrb_handle_cmdblk(cb, cmd_blk);
2987 else
2988 myrb_handle_scsi(cb, cmd_blk, scmd);
2989 }
2990 cb->next_stat_mbox = next_stat_mbox;
2991 spin_unlock_irqrestore(&cb->queue_lock, flags);
2992 return IRQ_HANDLED;
2993}
2994
Shixin Liu182ad872021-03-27 15:31:56 +08002995static struct myrb_privdata DAC960_PG_privdata = {
Hannes Reinecke081ff392018-10-17 17:25:11 +02002996 .hw_init = DAC960_PG_hw_init,
2997 .irq_handler = DAC960_PG_intr_handler,
2998 .mmio_size = DAC960_PG_mmio_size,
2999};
3000
3001
3002/*
3003 * DAC960 PD Series Controllers
3004 */
3005
3006static inline void DAC960_PD_hw_mbox_new_cmd(void __iomem *base)
3007{
3008 writeb(DAC960_PD_IDB_HWMBOX_NEW_CMD, base + DAC960_PD_IDB_OFFSET);
3009}
3010
3011static inline void DAC960_PD_ack_hw_mbox_status(void __iomem *base)
3012{
3013 writeb(DAC960_PD_IDB_HWMBOX_ACK_STS, base + DAC960_PD_IDB_OFFSET);
3014}
3015
Hannes Reinecke081ff392018-10-17 17:25:11 +02003016static inline void DAC960_PD_reset_ctrl(void __iomem *base)
3017{
3018 writeb(DAC960_PD_IDB_CTRL_RESET, base + DAC960_PD_IDB_OFFSET);
3019}
3020
3021static inline bool DAC960_PD_hw_mbox_is_full(void __iomem *base)
3022{
3023 unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3024
3025 return idb & DAC960_PD_IDB_HWMBOX_FULL;
3026}
3027
3028static inline bool DAC960_PD_init_in_progress(void __iomem *base)
3029{
3030 unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3031
3032 return idb & DAC960_PD_IDB_INIT_IN_PROGRESS;
3033}
3034
3035static inline void DAC960_PD_ack_intr(void __iomem *base)
3036{
3037 writeb(DAC960_PD_ODB_HWMBOX_ACK_IRQ, base + DAC960_PD_ODB_OFFSET);
3038}
3039
3040static inline bool DAC960_PD_hw_mbox_status_available(void __iomem *base)
3041{
3042 unsigned char odb = readb(base + DAC960_PD_ODB_OFFSET);
3043
3044 return odb & DAC960_PD_ODB_HWMBOX_STS_AVAIL;
3045}
3046
3047static inline void DAC960_PD_enable_intr(void __iomem *base)
3048{
3049 writeb(DAC960_PD_IRQMASK_ENABLE_IRQ, base + DAC960_PD_IRQEN_OFFSET);
3050}
3051
3052static inline void DAC960_PD_disable_intr(void __iomem *base)
3053{
3054 writeb(0, base + DAC960_PD_IRQEN_OFFSET);
3055}
3056
Hannes Reinecke081ff392018-10-17 17:25:11 +02003057static inline void DAC960_PD_write_cmd_mbox(void __iomem *base,
3058 union myrb_cmd_mbox *mbox)
3059{
3060 writel(mbox->words[0], base + DAC960_PD_CMDOP_OFFSET);
3061 writel(mbox->words[1], base + DAC960_PD_MBOX4_OFFSET);
3062 writel(mbox->words[2], base + DAC960_PD_MBOX8_OFFSET);
3063 writeb(mbox->bytes[12], base + DAC960_PD_MBOX12_OFFSET);
3064}
3065
3066static inline unsigned char
3067DAC960_PD_read_status_cmd_ident(void __iomem *base)
3068{
3069 return readb(base + DAC960_PD_STSID_OFFSET);
3070}
3071
3072static inline unsigned short
3073DAC960_PD_read_status(void __iomem *base)
3074{
3075 return readw(base + DAC960_PD_STS_OFFSET);
3076}
3077
3078static inline bool
3079DAC960_PD_read_error_status(void __iomem *base, unsigned char *error,
3080 unsigned char *param0, unsigned char *param1)
3081{
3082 unsigned char errsts = readb(base + DAC960_PD_ERRSTS_OFFSET);
3083
3084 if (!(errsts & DAC960_PD_ERRSTS_PENDING))
3085 return false;
3086 errsts &= ~DAC960_PD_ERRSTS_PENDING;
3087 *error = errsts;
3088 *param0 = readb(base + DAC960_PD_CMDOP_OFFSET);
3089 *param1 = readb(base + DAC960_PD_CMDID_OFFSET);
3090 writeb(0, base + DAC960_PD_ERRSTS_OFFSET);
3091 return true;
3092}
3093
3094static void DAC960_PD_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3095{
3096 void __iomem *base = cb->io_base;
3097 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3098
3099 while (DAC960_PD_hw_mbox_is_full(base))
3100 udelay(1);
3101 DAC960_PD_write_cmd_mbox(base, mbox);
3102 DAC960_PD_hw_mbox_new_cmd(base);
3103}
3104
3105static int DAC960_PD_hw_init(struct pci_dev *pdev,
3106 struct myrb_hba *cb, void __iomem *base)
3107{
3108 int timeout = 0;
3109 unsigned char error, parm0, parm1;
3110
3111 if (!request_region(cb->io_addr, 0x80, "myrb")) {
3112 dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3113 (unsigned long)cb->io_addr);
3114 return -EBUSY;
3115 }
3116 DAC960_PD_disable_intr(base);
3117 DAC960_PD_ack_hw_mbox_status(base);
3118 udelay(1000);
3119 while (DAC960_PD_init_in_progress(base) &&
3120 timeout < MYRB_MAILBOX_TIMEOUT) {
3121 if (DAC960_PD_read_error_status(base, &error,
3122 &parm0, &parm1) &&
3123 myrb_err_status(cb, error, parm0, parm1))
3124 return -EIO;
3125 udelay(10);
3126 timeout++;
3127 }
3128 if (timeout == MYRB_MAILBOX_TIMEOUT) {
3129 dev_err(&pdev->dev,
3130 "Timeout waiting for Controller Initialisation\n");
3131 return -ETIMEDOUT;
3132 }
3133 if (!myrb_enable_mmio(cb, NULL)) {
3134 dev_err(&pdev->dev,
3135 "Unable to Enable Memory Mailbox Interface\n");
3136 DAC960_PD_reset_ctrl(base);
3137 return -ENODEV;
3138 }
3139 DAC960_PD_enable_intr(base);
3140 cb->qcmd = DAC960_PD_qcmd;
3141 cb->disable_intr = DAC960_PD_disable_intr;
3142 cb->reset = DAC960_PD_reset_ctrl;
3143
3144 return 0;
3145}
3146
3147static irqreturn_t DAC960_PD_intr_handler(int irq, void *arg)
3148{
3149 struct myrb_hba *cb = arg;
3150 void __iomem *base = cb->io_base;
3151 unsigned long flags;
3152
3153 spin_lock_irqsave(&cb->queue_lock, flags);
3154 while (DAC960_PD_hw_mbox_status_available(base)) {
3155 unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3156 struct scsi_cmnd *scmd = NULL;
3157 struct myrb_cmdblk *cmd_blk = NULL;
3158
3159 if (id == MYRB_DCMD_TAG)
3160 cmd_blk = &cb->dcmd_blk;
3161 else if (id == MYRB_MCMD_TAG)
3162 cmd_blk = &cb->mcmd_blk;
3163 else {
3164 scmd = scsi_host_find_tag(cb->host, id - 3);
3165 if (scmd)
3166 cmd_blk = scsi_cmd_priv(scmd);
3167 }
3168 if (cmd_blk)
3169 cmd_blk->status = DAC960_PD_read_status(base);
3170 else
3171 dev_err(&cb->pdev->dev,
3172 "Unhandled command completion %d\n", id);
3173
3174 DAC960_PD_ack_intr(base);
3175 DAC960_PD_ack_hw_mbox_status(base);
3176
3177 if (id < 3)
3178 myrb_handle_cmdblk(cb, cmd_blk);
3179 else
3180 myrb_handle_scsi(cb, cmd_blk, scmd);
3181 }
3182 spin_unlock_irqrestore(&cb->queue_lock, flags);
3183 return IRQ_HANDLED;
3184}
3185
Shixin Liu182ad872021-03-27 15:31:56 +08003186static struct myrb_privdata DAC960_PD_privdata = {
Hannes Reinecke081ff392018-10-17 17:25:11 +02003187 .hw_init = DAC960_PD_hw_init,
3188 .irq_handler = DAC960_PD_intr_handler,
3189 .mmio_size = DAC960_PD_mmio_size,
3190};
3191
3192
3193/*
3194 * DAC960 P Series Controllers
3195 *
3196 * Similar to the DAC960 PD Series Controllers, but some commands have
3197 * to be translated.
3198 */
3199
3200static inline void myrb_translate_enquiry(void *enq)
3201{
3202 memcpy(enq + 132, enq + 36, 64);
3203 memset(enq + 36, 0, 96);
3204}
3205
3206static inline void myrb_translate_devstate(void *state)
3207{
3208 memcpy(state + 2, state + 3, 1);
3209 memmove(state + 4, state + 5, 2);
3210 memmove(state + 6, state + 8, 4);
3211}
3212
3213static inline void myrb_translate_to_rw_command(struct myrb_cmdblk *cmd_blk)
3214{
3215 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3216 int ldev_num = mbox->type5.ld.ldev_num;
3217
3218 mbox->bytes[3] &= 0x7;
3219 mbox->bytes[3] |= mbox->bytes[7] << 6;
3220 mbox->bytes[7] = ldev_num;
3221}
3222
3223static inline void myrb_translate_from_rw_command(struct myrb_cmdblk *cmd_blk)
3224{
3225 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3226 int ldev_num = mbox->bytes[7];
3227
3228 mbox->bytes[7] = mbox->bytes[3] >> 6;
3229 mbox->bytes[3] &= 0x7;
3230 mbox->bytes[3] |= ldev_num << 3;
3231}
3232
3233static void DAC960_P_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3234{
3235 void __iomem *base = cb->io_base;
3236 union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3237
3238 switch (mbox->common.opcode) {
3239 case MYRB_CMD_ENQUIRY:
3240 mbox->common.opcode = MYRB_CMD_ENQUIRY_OLD;
3241 break;
3242 case MYRB_CMD_GET_DEVICE_STATE:
3243 mbox->common.opcode = MYRB_CMD_GET_DEVICE_STATE_OLD;
3244 break;
3245 case MYRB_CMD_READ:
3246 mbox->common.opcode = MYRB_CMD_READ_OLD;
3247 myrb_translate_to_rw_command(cmd_blk);
3248 break;
3249 case MYRB_CMD_WRITE:
3250 mbox->common.opcode = MYRB_CMD_WRITE_OLD;
3251 myrb_translate_to_rw_command(cmd_blk);
3252 break;
3253 case MYRB_CMD_READ_SG:
3254 mbox->common.opcode = MYRB_CMD_READ_SG_OLD;
3255 myrb_translate_to_rw_command(cmd_blk);
3256 break;
3257 case MYRB_CMD_WRITE_SG:
3258 mbox->common.opcode = MYRB_CMD_WRITE_SG_OLD;
3259 myrb_translate_to_rw_command(cmd_blk);
3260 break;
3261 default:
3262 break;
3263 }
3264 while (DAC960_PD_hw_mbox_is_full(base))
3265 udelay(1);
3266 DAC960_PD_write_cmd_mbox(base, mbox);
3267 DAC960_PD_hw_mbox_new_cmd(base);
3268}
3269
3270
3271static int DAC960_P_hw_init(struct pci_dev *pdev,
3272 struct myrb_hba *cb, void __iomem *base)
3273{
3274 int timeout = 0;
3275 unsigned char error, parm0, parm1;
3276
3277 if (!request_region(cb->io_addr, 0x80, "myrb")) {
3278 dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3279 (unsigned long)cb->io_addr);
3280 return -EBUSY;
3281 }
3282 DAC960_PD_disable_intr(base);
3283 DAC960_PD_ack_hw_mbox_status(base);
3284 udelay(1000);
3285 while (DAC960_PD_init_in_progress(base) &&
3286 timeout < MYRB_MAILBOX_TIMEOUT) {
3287 if (DAC960_PD_read_error_status(base, &error,
3288 &parm0, &parm1) &&
3289 myrb_err_status(cb, error, parm0, parm1))
3290 return -EAGAIN;
3291 udelay(10);
3292 timeout++;
3293 }
3294 if (timeout == MYRB_MAILBOX_TIMEOUT) {
3295 dev_err(&pdev->dev,
3296 "Timeout waiting for Controller Initialisation\n");
3297 return -ETIMEDOUT;
3298 }
3299 if (!myrb_enable_mmio(cb, NULL)) {
3300 dev_err(&pdev->dev,
3301 "Unable to allocate DMA mapped memory\n");
3302 DAC960_PD_reset_ctrl(base);
3303 return -ETIMEDOUT;
3304 }
3305 DAC960_PD_enable_intr(base);
3306 cb->qcmd = DAC960_P_qcmd;
3307 cb->disable_intr = DAC960_PD_disable_intr;
3308 cb->reset = DAC960_PD_reset_ctrl;
3309
3310 return 0;
3311}
3312
3313static irqreturn_t DAC960_P_intr_handler(int irq, void *arg)
3314{
3315 struct myrb_hba *cb = arg;
3316 void __iomem *base = cb->io_base;
3317 unsigned long flags;
3318
3319 spin_lock_irqsave(&cb->queue_lock, flags);
3320 while (DAC960_PD_hw_mbox_status_available(base)) {
3321 unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3322 struct scsi_cmnd *scmd = NULL;
3323 struct myrb_cmdblk *cmd_blk = NULL;
3324 union myrb_cmd_mbox *mbox;
3325 enum myrb_cmd_opcode op;
3326
3327
3328 if (id == MYRB_DCMD_TAG)
3329 cmd_blk = &cb->dcmd_blk;
3330 else if (id == MYRB_MCMD_TAG)
3331 cmd_blk = &cb->mcmd_blk;
3332 else {
3333 scmd = scsi_host_find_tag(cb->host, id - 3);
3334 if (scmd)
3335 cmd_blk = scsi_cmd_priv(scmd);
3336 }
3337 if (cmd_blk)
3338 cmd_blk->status = DAC960_PD_read_status(base);
3339 else
3340 dev_err(&cb->pdev->dev,
3341 "Unhandled command completion %d\n", id);
3342
3343 DAC960_PD_ack_intr(base);
3344 DAC960_PD_ack_hw_mbox_status(base);
3345
3346 if (!cmd_blk)
3347 continue;
3348
3349 mbox = &cmd_blk->mbox;
3350 op = mbox->common.opcode;
3351 switch (op) {
3352 case MYRB_CMD_ENQUIRY_OLD:
3353 mbox->common.opcode = MYRB_CMD_ENQUIRY;
3354 myrb_translate_enquiry(cb->enquiry);
3355 break;
3356 case MYRB_CMD_READ_OLD:
3357 mbox->common.opcode = MYRB_CMD_READ;
3358 myrb_translate_from_rw_command(cmd_blk);
3359 break;
3360 case MYRB_CMD_WRITE_OLD:
3361 mbox->common.opcode = MYRB_CMD_WRITE;
3362 myrb_translate_from_rw_command(cmd_blk);
3363 break;
3364 case MYRB_CMD_READ_SG_OLD:
3365 mbox->common.opcode = MYRB_CMD_READ_SG;
3366 myrb_translate_from_rw_command(cmd_blk);
3367 break;
3368 case MYRB_CMD_WRITE_SG_OLD:
3369 mbox->common.opcode = MYRB_CMD_WRITE_SG;
3370 myrb_translate_from_rw_command(cmd_blk);
3371 break;
3372 default:
3373 break;
3374 }
3375 if (id < 3)
3376 myrb_handle_cmdblk(cb, cmd_blk);
3377 else
3378 myrb_handle_scsi(cb, cmd_blk, scmd);
3379 }
3380 spin_unlock_irqrestore(&cb->queue_lock, flags);
3381 return IRQ_HANDLED;
3382}
3383
Shixin Liu182ad872021-03-27 15:31:56 +08003384static struct myrb_privdata DAC960_P_privdata = {
Hannes Reinecke081ff392018-10-17 17:25:11 +02003385 .hw_init = DAC960_P_hw_init,
3386 .irq_handler = DAC960_P_intr_handler,
3387 .mmio_size = DAC960_PD_mmio_size,
3388};
3389
3390static struct myrb_hba *myrb_detect(struct pci_dev *pdev,
3391 const struct pci_device_id *entry)
3392{
3393 struct myrb_privdata *privdata =
3394 (struct myrb_privdata *)entry->driver_data;
3395 irq_handler_t irq_handler = privdata->irq_handler;
3396 unsigned int mmio_size = privdata->mmio_size;
3397 struct Scsi_Host *shost;
3398 struct myrb_hba *cb = NULL;
3399
3400 shost = scsi_host_alloc(&myrb_template, sizeof(struct myrb_hba));
3401 if (!shost) {
3402 dev_err(&pdev->dev, "Unable to allocate Controller\n");
3403 return NULL;
3404 }
3405 shost->max_cmd_len = 12;
3406 shost->max_lun = 256;
3407 cb = shost_priv(shost);
3408 mutex_init(&cb->dcmd_mutex);
3409 mutex_init(&cb->dma_mutex);
3410 cb->pdev = pdev;
3411
3412 if (pci_enable_device(pdev))
3413 goto failure;
3414
3415 if (privdata->hw_init == DAC960_PD_hw_init ||
3416 privdata->hw_init == DAC960_P_hw_init) {
3417 cb->io_addr = pci_resource_start(pdev, 0);
3418 cb->pci_addr = pci_resource_start(pdev, 1);
3419 } else
3420 cb->pci_addr = pci_resource_start(pdev, 0);
3421
3422 pci_set_drvdata(pdev, cb);
3423 spin_lock_init(&cb->queue_lock);
3424 if (mmio_size < PAGE_SIZE)
3425 mmio_size = PAGE_SIZE;
Christoph Hellwig4bdc0d62020-01-06 09:43:50 +01003426 cb->mmio_base = ioremap(cb->pci_addr & PAGE_MASK, mmio_size);
Hannes Reinecke081ff392018-10-17 17:25:11 +02003427 if (cb->mmio_base == NULL) {
3428 dev_err(&pdev->dev,
3429 "Unable to map Controller Register Window\n");
3430 goto failure;
3431 }
3432
3433 cb->io_base = cb->mmio_base + (cb->pci_addr & ~PAGE_MASK);
3434 if (privdata->hw_init(pdev, cb, cb->io_base))
3435 goto failure;
3436
3437 if (request_irq(pdev->irq, irq_handler, IRQF_SHARED, "myrb", cb) < 0) {
3438 dev_err(&pdev->dev,
3439 "Unable to acquire IRQ Channel %d\n", pdev->irq);
3440 goto failure;
3441 }
3442 cb->irq = pdev->irq;
3443 return cb;
3444
3445failure:
3446 dev_err(&pdev->dev,
3447 "Failed to initialize Controller\n");
3448 myrb_cleanup(cb);
3449 return NULL;
3450}
3451
3452static int myrb_probe(struct pci_dev *dev, const struct pci_device_id *entry)
3453{
3454 struct myrb_hba *cb;
3455 int ret;
3456
3457 cb = myrb_detect(dev, entry);
3458 if (!cb)
3459 return -ENODEV;
3460
3461 ret = myrb_get_hba_config(cb);
3462 if (ret < 0) {
3463 myrb_cleanup(cb);
3464 return ret;
3465 }
3466
3467 if (!myrb_create_mempools(dev, cb)) {
3468 ret = -ENOMEM;
3469 goto failed;
3470 }
3471
3472 ret = scsi_add_host(cb->host, &dev->dev);
3473 if (ret) {
3474 dev_err(&dev->dev, "scsi_add_host failed with %d\n", ret);
3475 myrb_destroy_mempools(cb);
3476 goto failed;
3477 }
3478 scsi_scan_host(cb->host);
3479 return 0;
3480failed:
3481 myrb_cleanup(cb);
3482 return ret;
3483}
3484
3485
3486static void myrb_remove(struct pci_dev *pdev)
3487{
3488 struct myrb_hba *cb = pci_get_drvdata(pdev);
3489
3490 shost_printk(KERN_NOTICE, cb->host, "Flushing Cache...");
3491 myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
3492 myrb_cleanup(cb);
3493 myrb_destroy_mempools(cb);
3494}
3495
3496
3497static const struct pci_device_id myrb_id_table[] = {
3498 {
3499 PCI_DEVICE_SUB(PCI_VENDOR_ID_DEC,
3500 PCI_DEVICE_ID_DEC_21285,
3501 PCI_VENDOR_ID_MYLEX,
3502 PCI_DEVICE_ID_MYLEX_DAC960_LA),
3503 .driver_data = (unsigned long) &DAC960_LA_privdata,
3504 },
3505 {
3506 PCI_DEVICE_DATA(MYLEX, DAC960_PG, &DAC960_PG_privdata),
3507 },
3508 {
3509 PCI_DEVICE_DATA(MYLEX, DAC960_PD, &DAC960_PD_privdata),
3510 },
3511 {
3512 PCI_DEVICE_DATA(MYLEX, DAC960_P, &DAC960_P_privdata),
3513 },
3514 {0, },
3515};
3516
3517MODULE_DEVICE_TABLE(pci, myrb_id_table);
3518
3519static struct pci_driver myrb_pci_driver = {
3520 .name = "myrb",
3521 .id_table = myrb_id_table,
3522 .probe = myrb_probe,
3523 .remove = myrb_remove,
3524};
3525
3526static int __init myrb_init_module(void)
3527{
3528 int ret;
3529
3530 myrb_raid_template = raid_class_attach(&myrb_raid_functions);
3531 if (!myrb_raid_template)
3532 return -ENODEV;
3533
3534 ret = pci_register_driver(&myrb_pci_driver);
3535 if (ret)
3536 raid_class_release(myrb_raid_template);
3537
3538 return ret;
3539}
3540
3541static void __exit myrb_cleanup_module(void)
3542{
3543 pci_unregister_driver(&myrb_pci_driver);
3544 raid_class_release(myrb_raid_template);
3545}
3546
3547module_init(myrb_init_module);
3548module_exit(myrb_cleanup_module);
3549
3550MODULE_DESCRIPTION("Mylex DAC960/AcceleRAID/eXtremeRAID driver (Block interface)");
3551MODULE_AUTHOR("Hannes Reinecke <hare@suse.com>");
3552MODULE_LICENSE("GPL");