xref: /openbmc/linux/drivers/scsi/myrb.c (revision 3d37ef41)
1 // 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 
27 static struct raid_template *myrb_raid_template;
28 
29 static void myrb_monitor(struct work_struct *work);
30 static inline void myrb_translate_devstate(void *DeviceState);
31 
32 static inline int myrb_logical_channel(struct Scsi_Host *shost)
33 {
34 	return shost->max_channel - 1;
35 }
36 
37 static 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 
49 static 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 
61 static 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 
73 static 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 
85 /*
86  * myrb_create_mempools - allocates auxiliary data structures
87  *
88  * Return: true on success, false otherwise.
89  */
90 static 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 
137 /*
138  * myrb_destroy_mempools - tears down the memory pools for the controller
139  */
140 static 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 
149 /*
150  * myrb_reset_cmd - reset command block
151  */
152 static 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 
160 /*
161  * myrb_qcmd - queues command block for execution
162  */
163 static 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 
180 /*
181  * myrb_exec_cmd - executes command block and waits for completion.
182  *
183  * Return: command status
184  */
185 static 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 
197 	wait_for_completion(&cmpl);
198 	return cmd_blk->status;
199 }
200 
201 /*
202  * myrb_exec_type3 - executes a type 3 command and waits for completion.
203  *
204  * Return: command status
205  */
206 static 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 
223 /*
224  * myrb_exec_type3D - executes a type 3D command and waits for completion.
225  *
226  * Return: command status
227  */
228 static 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 
261 static 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  */
284 static 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 
335 /*
336  * 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  */
340 static 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 
380 /*
381  * 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  */
387 static 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 
430 /*
431  * 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  */
438 static 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 
465 /*
466  * myrb_update_rbld_progress - updates the rebuild status
467  *
468  * Updates the rebuild status for the attached logical devices.
469  */
470 static 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 
525 /*
526  * myrb_get_cc_progress - retrieve the rebuild status
527  *
528  * Execute a type 3 Command and fetch the rebuild / consistency check
529  * status.
530  */
531 static 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 
573 /*
574  * myrb_bgi_control - updates background initialisation status
575  *
576  * Executes a type 3B command and updates the background initialisation status
577  */
578 static 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");
651 		fallthrough;
652 	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 
662 /*
663  * 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  */
669 static 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 
774 /*
775  * myrb_set_pdev_state - sets the device state for a physical device
776  *
777  * Return: command status
778  */
779 static 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 
798 /*
799  * 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  */
806 static 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 
903 /*
904  * 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  */
911 static 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 	}
1050 	snprintf(cb->fw_version, sizeof(cb->fw_version),
1051 		"%u.%02u-%c-%02u",
1052 		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 
1149 out:
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 
1186 out_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 
1195 /*
1196  * myrb_unmap - unmaps controller structures
1197  */
1198 static 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 
1231 /*
1232  * myrb_cleanup - cleanup controller structures
1233  */
1234 static 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 
1254 static 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 
1263 static 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 
1337 static 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 
1360 static void
1361 myrb_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 
1397 static void myrb_request_sense(struct myrb_hba *cb,
1398 		struct scsi_cmnd *scmd)
1399 {
1400 	scsi_build_sense_buffer(0, scmd->sense_buffer,
1401 				NO_SENSE, 0, 0);
1402 	scsi_sg_copy_from_buffer(scmd, scmd->sense_buffer,
1403 				 SCSI_SENSE_BUFFERSIZE);
1404 }
1405 
1406 static void myrb_read_capacity(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1407 		struct myrb_ldev_info *ldev_info)
1408 {
1409 	unsigned char data[8];
1410 
1411 	dev_dbg(&scmd->device->sdev_gendev,
1412 		"Capacity %u, blocksize %u\n",
1413 		ldev_info->size, cb->ldev_block_size);
1414 	put_unaligned_be32(ldev_info->size - 1, &data[0]);
1415 	put_unaligned_be32(cb->ldev_block_size, &data[4]);
1416 	scsi_sg_copy_from_buffer(scmd, data, 8);
1417 }
1418 
1419 static int myrb_ldev_queuecommand(struct Scsi_Host *shost,
1420 		struct scsi_cmnd *scmd)
1421 {
1422 	struct myrb_hba *cb = shost_priv(shost);
1423 	struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1424 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1425 	struct myrb_ldev_info *ldev_info;
1426 	struct scsi_device *sdev = scmd->device;
1427 	struct scatterlist *sgl;
1428 	unsigned long flags;
1429 	u64 lba;
1430 	u32 block_cnt;
1431 	int nsge;
1432 
1433 	ldev_info = sdev->hostdata;
1434 	if (ldev_info->state != MYRB_DEVICE_ONLINE &&
1435 	    ldev_info->state != MYRB_DEVICE_WO) {
1436 		dev_dbg(&shost->shost_gendev, "ldev %u in state %x, skip\n",
1437 			sdev->id, ldev_info ? ldev_info->state : 0xff);
1438 		scmd->result = (DID_BAD_TARGET << 16);
1439 		scmd->scsi_done(scmd);
1440 		return 0;
1441 	}
1442 	switch (scmd->cmnd[0]) {
1443 	case TEST_UNIT_READY:
1444 		scmd->result = (DID_OK << 16);
1445 		scmd->scsi_done(scmd);
1446 		return 0;
1447 	case INQUIRY:
1448 		if (scmd->cmnd[1] & 1) {
1449 			/* Illegal request, invalid field in CDB */
1450 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1451 						ILLEGAL_REQUEST, 0x24, 0);
1452 			scmd->result = (DRIVER_SENSE << 24) |
1453 				SAM_STAT_CHECK_CONDITION;
1454 		} else {
1455 			myrb_inquiry(cb, scmd);
1456 			scmd->result = (DID_OK << 16);
1457 		}
1458 		scmd->scsi_done(scmd);
1459 		return 0;
1460 	case SYNCHRONIZE_CACHE:
1461 		scmd->result = (DID_OK << 16);
1462 		scmd->scsi_done(scmd);
1463 		return 0;
1464 	case MODE_SENSE:
1465 		if ((scmd->cmnd[2] & 0x3F) != 0x3F &&
1466 		    (scmd->cmnd[2] & 0x3F) != 0x08) {
1467 			/* Illegal request, invalid field in CDB */
1468 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1469 						ILLEGAL_REQUEST, 0x24, 0);
1470 			scmd->result = (DRIVER_SENSE << 24) |
1471 				SAM_STAT_CHECK_CONDITION;
1472 		} else {
1473 			myrb_mode_sense(cb, scmd, ldev_info);
1474 			scmd->result = (DID_OK << 16);
1475 		}
1476 		scmd->scsi_done(scmd);
1477 		return 0;
1478 	case READ_CAPACITY:
1479 		if ((scmd->cmnd[1] & 1) ||
1480 		    (scmd->cmnd[8] & 1)) {
1481 			/* Illegal request, invalid field in CDB */
1482 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1483 						ILLEGAL_REQUEST, 0x24, 0);
1484 			scmd->result = (DRIVER_SENSE << 24) |
1485 				SAM_STAT_CHECK_CONDITION;
1486 			scmd->scsi_done(scmd);
1487 			return 0;
1488 		}
1489 		lba = get_unaligned_be32(&scmd->cmnd[2]);
1490 		if (lba) {
1491 			/* Illegal request, invalid field in CDB */
1492 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1493 						ILLEGAL_REQUEST, 0x24, 0);
1494 			scmd->result = (DRIVER_SENSE << 24) |
1495 				SAM_STAT_CHECK_CONDITION;
1496 			scmd->scsi_done(scmd);
1497 			return 0;
1498 		}
1499 		myrb_read_capacity(cb, scmd, ldev_info);
1500 		scmd->scsi_done(scmd);
1501 		return 0;
1502 	case REQUEST_SENSE:
1503 		myrb_request_sense(cb, scmd);
1504 		scmd->result = (DID_OK << 16);
1505 		return 0;
1506 	case SEND_DIAGNOSTIC:
1507 		if (scmd->cmnd[1] != 0x04) {
1508 			/* Illegal request, invalid field in CDB */
1509 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1510 						ILLEGAL_REQUEST, 0x24, 0);
1511 			scmd->result = (DRIVER_SENSE << 24) |
1512 				SAM_STAT_CHECK_CONDITION;
1513 		} else {
1514 			/* Assume good status */
1515 			scmd->result = (DID_OK << 16);
1516 		}
1517 		scmd->scsi_done(scmd);
1518 		return 0;
1519 	case READ_6:
1520 		if (ldev_info->state == MYRB_DEVICE_WO) {
1521 			/* Data protect, attempt to read invalid data */
1522 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1523 						DATA_PROTECT, 0x21, 0x06);
1524 			scmd->result = (DRIVER_SENSE << 24) |
1525 				SAM_STAT_CHECK_CONDITION;
1526 			scmd->scsi_done(scmd);
1527 			return 0;
1528 		}
1529 		fallthrough;
1530 	case WRITE_6:
1531 		lba = (((scmd->cmnd[1] & 0x1F) << 16) |
1532 		       (scmd->cmnd[2] << 8) |
1533 		       scmd->cmnd[3]);
1534 		block_cnt = scmd->cmnd[4];
1535 		break;
1536 	case READ_10:
1537 		if (ldev_info->state == MYRB_DEVICE_WO) {
1538 			/* Data protect, attempt to read invalid data */
1539 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1540 						DATA_PROTECT, 0x21, 0x06);
1541 			scmd->result = (DRIVER_SENSE << 24) |
1542 				SAM_STAT_CHECK_CONDITION;
1543 			scmd->scsi_done(scmd);
1544 			return 0;
1545 		}
1546 		fallthrough;
1547 	case WRITE_10:
1548 	case VERIFY:		/* 0x2F */
1549 	case WRITE_VERIFY:	/* 0x2E */
1550 		lba = get_unaligned_be32(&scmd->cmnd[2]);
1551 		block_cnt = get_unaligned_be16(&scmd->cmnd[7]);
1552 		break;
1553 	case READ_12:
1554 		if (ldev_info->state == MYRB_DEVICE_WO) {
1555 			/* Data protect, attempt to read invalid data */
1556 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1557 						DATA_PROTECT, 0x21, 0x06);
1558 			scmd->result = (DRIVER_SENSE << 24) |
1559 				SAM_STAT_CHECK_CONDITION;
1560 			scmd->scsi_done(scmd);
1561 			return 0;
1562 		}
1563 		fallthrough;
1564 	case WRITE_12:
1565 	case VERIFY_12: /* 0xAF */
1566 	case WRITE_VERIFY_12:	/* 0xAE */
1567 		lba = get_unaligned_be32(&scmd->cmnd[2]);
1568 		block_cnt = get_unaligned_be32(&scmd->cmnd[6]);
1569 		break;
1570 	default:
1571 		/* Illegal request, invalid opcode */
1572 		scsi_build_sense_buffer(0, scmd->sense_buffer,
1573 					ILLEGAL_REQUEST, 0x20, 0);
1574 		scmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
1575 		scmd->scsi_done(scmd);
1576 		return 0;
1577 	}
1578 
1579 	myrb_reset_cmd(cmd_blk);
1580 	mbox->type5.id = scmd->request->tag + 3;
1581 	if (scmd->sc_data_direction == DMA_NONE)
1582 		goto submit;
1583 	nsge = scsi_dma_map(scmd);
1584 	if (nsge == 1) {
1585 		sgl = scsi_sglist(scmd);
1586 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1587 			mbox->type5.opcode = MYRB_CMD_READ;
1588 		else
1589 			mbox->type5.opcode = MYRB_CMD_WRITE;
1590 
1591 		mbox->type5.ld.xfer_len = block_cnt;
1592 		mbox->type5.ld.ldev_num = sdev->id;
1593 		mbox->type5.lba = lba;
1594 		mbox->type5.addr = (u32)sg_dma_address(sgl);
1595 	} else {
1596 		struct myrb_sge *hw_sgl;
1597 		dma_addr_t hw_sgl_addr;
1598 		int i;
1599 
1600 		hw_sgl = dma_pool_alloc(cb->sg_pool, GFP_ATOMIC, &hw_sgl_addr);
1601 		if (!hw_sgl)
1602 			return SCSI_MLQUEUE_HOST_BUSY;
1603 
1604 		cmd_blk->sgl = hw_sgl;
1605 		cmd_blk->sgl_addr = hw_sgl_addr;
1606 
1607 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1608 			mbox->type5.opcode = MYRB_CMD_READ_SG;
1609 		else
1610 			mbox->type5.opcode = MYRB_CMD_WRITE_SG;
1611 
1612 		mbox->type5.ld.xfer_len = block_cnt;
1613 		mbox->type5.ld.ldev_num = sdev->id;
1614 		mbox->type5.lba = lba;
1615 		mbox->type5.addr = hw_sgl_addr;
1616 		mbox->type5.sg_count = nsge;
1617 
1618 		scsi_for_each_sg(scmd, sgl, nsge, i) {
1619 			hw_sgl->sge_addr = (u32)sg_dma_address(sgl);
1620 			hw_sgl->sge_count = (u32)sg_dma_len(sgl);
1621 			hw_sgl++;
1622 		}
1623 	}
1624 submit:
1625 	spin_lock_irqsave(&cb->queue_lock, flags);
1626 	cb->qcmd(cb, cmd_blk);
1627 	spin_unlock_irqrestore(&cb->queue_lock, flags);
1628 
1629 	return 0;
1630 }
1631 
1632 static int myrb_queuecommand(struct Scsi_Host *shost,
1633 		struct scsi_cmnd *scmd)
1634 {
1635 	struct scsi_device *sdev = scmd->device;
1636 
1637 	if (sdev->channel > myrb_logical_channel(shost)) {
1638 		scmd->result = (DID_BAD_TARGET << 16);
1639 		scmd->scsi_done(scmd);
1640 		return 0;
1641 	}
1642 	if (sdev->channel == myrb_logical_channel(shost))
1643 		return myrb_ldev_queuecommand(shost, scmd);
1644 
1645 	return myrb_pthru_queuecommand(shost, scmd);
1646 }
1647 
1648 static int myrb_ldev_slave_alloc(struct scsi_device *sdev)
1649 {
1650 	struct myrb_hba *cb = shost_priv(sdev->host);
1651 	struct myrb_ldev_info *ldev_info;
1652 	unsigned short ldev_num = sdev->id;
1653 	enum raid_level level;
1654 
1655 	ldev_info = cb->ldev_info_buf + ldev_num;
1656 	if (!ldev_info)
1657 		return -ENXIO;
1658 
1659 	sdev->hostdata = kzalloc(sizeof(*ldev_info), GFP_KERNEL);
1660 	if (!sdev->hostdata)
1661 		return -ENOMEM;
1662 	dev_dbg(&sdev->sdev_gendev,
1663 		"slave alloc ldev %d state %x\n",
1664 		ldev_num, ldev_info->state);
1665 	memcpy(sdev->hostdata, ldev_info,
1666 	       sizeof(*ldev_info));
1667 	switch (ldev_info->raid_level) {
1668 	case MYRB_RAID_LEVEL0:
1669 		level = RAID_LEVEL_LINEAR;
1670 		break;
1671 	case MYRB_RAID_LEVEL1:
1672 		level = RAID_LEVEL_1;
1673 		break;
1674 	case MYRB_RAID_LEVEL3:
1675 		level = RAID_LEVEL_3;
1676 		break;
1677 	case MYRB_RAID_LEVEL5:
1678 		level = RAID_LEVEL_5;
1679 		break;
1680 	case MYRB_RAID_LEVEL6:
1681 		level = RAID_LEVEL_6;
1682 		break;
1683 	case MYRB_RAID_JBOD:
1684 		level = RAID_LEVEL_JBOD;
1685 		break;
1686 	default:
1687 		level = RAID_LEVEL_UNKNOWN;
1688 		break;
1689 	}
1690 	raid_set_level(myrb_raid_template, &sdev->sdev_gendev, level);
1691 	return 0;
1692 }
1693 
1694 static int myrb_pdev_slave_alloc(struct scsi_device *sdev)
1695 {
1696 	struct myrb_hba *cb = shost_priv(sdev->host);
1697 	struct myrb_pdev_state *pdev_info;
1698 	unsigned short status;
1699 
1700 	if (sdev->id > MYRB_MAX_TARGETS)
1701 		return -ENXIO;
1702 
1703 	pdev_info = kzalloc(sizeof(*pdev_info), GFP_KERNEL|GFP_DMA);
1704 	if (!pdev_info)
1705 		return -ENOMEM;
1706 
1707 	status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1708 				  sdev, pdev_info);
1709 	if (status != MYRB_STATUS_SUCCESS) {
1710 		dev_dbg(&sdev->sdev_gendev,
1711 			"Failed to get device state, status %x\n",
1712 			status);
1713 		kfree(pdev_info);
1714 		return -ENXIO;
1715 	}
1716 	if (!pdev_info->present) {
1717 		dev_dbg(&sdev->sdev_gendev,
1718 			"device not present, skip\n");
1719 		kfree(pdev_info);
1720 		return -ENXIO;
1721 	}
1722 	dev_dbg(&sdev->sdev_gendev,
1723 		"slave alloc pdev %d:%d state %x\n",
1724 		sdev->channel, sdev->id, pdev_info->state);
1725 	sdev->hostdata = pdev_info;
1726 
1727 	return 0;
1728 }
1729 
1730 static int myrb_slave_alloc(struct scsi_device *sdev)
1731 {
1732 	if (sdev->channel > myrb_logical_channel(sdev->host))
1733 		return -ENXIO;
1734 
1735 	if (sdev->lun > 0)
1736 		return -ENXIO;
1737 
1738 	if (sdev->channel == myrb_logical_channel(sdev->host))
1739 		return myrb_ldev_slave_alloc(sdev);
1740 
1741 	return myrb_pdev_slave_alloc(sdev);
1742 }
1743 
1744 static int myrb_slave_configure(struct scsi_device *sdev)
1745 {
1746 	struct myrb_ldev_info *ldev_info;
1747 
1748 	if (sdev->channel > myrb_logical_channel(sdev->host))
1749 		return -ENXIO;
1750 
1751 	if (sdev->channel < myrb_logical_channel(sdev->host)) {
1752 		sdev->no_uld_attach = 1;
1753 		return 0;
1754 	}
1755 	if (sdev->lun != 0)
1756 		return -ENXIO;
1757 
1758 	ldev_info = sdev->hostdata;
1759 	if (!ldev_info)
1760 		return -ENXIO;
1761 	if (ldev_info->state != MYRB_DEVICE_ONLINE)
1762 		sdev_printk(KERN_INFO, sdev,
1763 			    "Logical drive is %s\n",
1764 			    myrb_devstate_name(ldev_info->state));
1765 
1766 	sdev->tagged_supported = 1;
1767 	return 0;
1768 }
1769 
1770 static void myrb_slave_destroy(struct scsi_device *sdev)
1771 {
1772 	kfree(sdev->hostdata);
1773 }
1774 
1775 static int myrb_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1776 		sector_t capacity, int geom[])
1777 {
1778 	struct myrb_hba *cb = shost_priv(sdev->host);
1779 
1780 	geom[0] = cb->ldev_geom_heads;
1781 	geom[1] = cb->ldev_geom_sectors;
1782 	geom[2] = sector_div(capacity, geom[0] * geom[1]);
1783 
1784 	return 0;
1785 }
1786 
1787 static ssize_t raid_state_show(struct device *dev,
1788 		struct device_attribute *attr, char *buf)
1789 {
1790 	struct scsi_device *sdev = to_scsi_device(dev);
1791 	struct myrb_hba *cb = shost_priv(sdev->host);
1792 	int ret;
1793 
1794 	if (!sdev->hostdata)
1795 		return snprintf(buf, 16, "Unknown\n");
1796 
1797 	if (sdev->channel == myrb_logical_channel(sdev->host)) {
1798 		struct myrb_ldev_info *ldev_info = sdev->hostdata;
1799 		const char *name;
1800 
1801 		name = myrb_devstate_name(ldev_info->state);
1802 		if (name)
1803 			ret = snprintf(buf, 32, "%s\n", name);
1804 		else
1805 			ret = snprintf(buf, 32, "Invalid (%02X)\n",
1806 				       ldev_info->state);
1807 	} else {
1808 		struct myrb_pdev_state *pdev_info = sdev->hostdata;
1809 		unsigned short status;
1810 		const char *name;
1811 
1812 		status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1813 					  sdev, pdev_info);
1814 		if (status != MYRB_STATUS_SUCCESS)
1815 			sdev_printk(KERN_INFO, sdev,
1816 				    "Failed to get device state, status %x\n",
1817 				    status);
1818 
1819 		if (!pdev_info->present)
1820 			name = "Removed";
1821 		else
1822 			name = myrb_devstate_name(pdev_info->state);
1823 		if (name)
1824 			ret = snprintf(buf, 32, "%s\n", name);
1825 		else
1826 			ret = snprintf(buf, 32, "Invalid (%02X)\n",
1827 				       pdev_info->state);
1828 	}
1829 	return ret;
1830 }
1831 
1832 static ssize_t raid_state_store(struct device *dev,
1833 		struct device_attribute *attr, const char *buf, size_t count)
1834 {
1835 	struct scsi_device *sdev = to_scsi_device(dev);
1836 	struct myrb_hba *cb = shost_priv(sdev->host);
1837 	struct myrb_pdev_state *pdev_info;
1838 	enum myrb_devstate new_state;
1839 	unsigned short status;
1840 
1841 	if (!strncmp(buf, "kill", 4) ||
1842 	    !strncmp(buf, "offline", 7))
1843 		new_state = MYRB_DEVICE_DEAD;
1844 	else if (!strncmp(buf, "online", 6))
1845 		new_state = MYRB_DEVICE_ONLINE;
1846 	else if (!strncmp(buf, "standby", 7))
1847 		new_state = MYRB_DEVICE_STANDBY;
1848 	else
1849 		return -EINVAL;
1850 
1851 	pdev_info = sdev->hostdata;
1852 	if (!pdev_info) {
1853 		sdev_printk(KERN_INFO, sdev,
1854 			    "Failed - no physical device information\n");
1855 		return -ENXIO;
1856 	}
1857 	if (!pdev_info->present) {
1858 		sdev_printk(KERN_INFO, sdev,
1859 			    "Failed - device not present\n");
1860 		return -ENXIO;
1861 	}
1862 
1863 	if (pdev_info->state == new_state)
1864 		return count;
1865 
1866 	status = myrb_set_pdev_state(cb, sdev, new_state);
1867 	switch (status) {
1868 	case MYRB_STATUS_SUCCESS:
1869 		break;
1870 	case MYRB_STATUS_START_DEVICE_FAILED:
1871 		sdev_printk(KERN_INFO, sdev,
1872 			     "Failed - Unable to Start Device\n");
1873 		count = -EAGAIN;
1874 		break;
1875 	case MYRB_STATUS_NO_DEVICE:
1876 		sdev_printk(KERN_INFO, sdev,
1877 			    "Failed - No Device at Address\n");
1878 		count = -ENODEV;
1879 		break;
1880 	case MYRB_STATUS_INVALID_CHANNEL_OR_TARGET:
1881 		sdev_printk(KERN_INFO, sdev,
1882 			 "Failed - Invalid Channel or Target or Modifier\n");
1883 		count = -EINVAL;
1884 		break;
1885 	case MYRB_STATUS_CHANNEL_BUSY:
1886 		sdev_printk(KERN_INFO, sdev,
1887 			 "Failed - Channel Busy\n");
1888 		count = -EBUSY;
1889 		break;
1890 	default:
1891 		sdev_printk(KERN_INFO, sdev,
1892 			 "Failed - Unexpected Status %04X\n", status);
1893 		count = -EIO;
1894 		break;
1895 	}
1896 	return count;
1897 }
1898 static DEVICE_ATTR_RW(raid_state);
1899 
1900 static ssize_t raid_level_show(struct device *dev,
1901 		struct device_attribute *attr, char *buf)
1902 {
1903 	struct scsi_device *sdev = to_scsi_device(dev);
1904 
1905 	if (sdev->channel == myrb_logical_channel(sdev->host)) {
1906 		struct myrb_ldev_info *ldev_info = sdev->hostdata;
1907 		const char *name;
1908 
1909 		if (!ldev_info)
1910 			return -ENXIO;
1911 
1912 		name = myrb_raidlevel_name(ldev_info->raid_level);
1913 		if (!name)
1914 			return snprintf(buf, 32, "Invalid (%02X)\n",
1915 					ldev_info->state);
1916 		return snprintf(buf, 32, "%s\n", name);
1917 	}
1918 	return snprintf(buf, 32, "Physical Drive\n");
1919 }
1920 static DEVICE_ATTR_RO(raid_level);
1921 
1922 static ssize_t rebuild_show(struct device *dev,
1923 		struct device_attribute *attr, char *buf)
1924 {
1925 	struct scsi_device *sdev = to_scsi_device(dev);
1926 	struct myrb_hba *cb = shost_priv(sdev->host);
1927 	struct myrb_rbld_progress rbld_buf;
1928 	unsigned char status;
1929 
1930 	if (sdev->channel < myrb_logical_channel(sdev->host))
1931 		return snprintf(buf, 32, "physical device - not rebuilding\n");
1932 
1933 	status = myrb_get_rbld_progress(cb, &rbld_buf);
1934 
1935 	if (rbld_buf.ldev_num != sdev->id ||
1936 	    status != MYRB_STATUS_SUCCESS)
1937 		return snprintf(buf, 32, "not rebuilding\n");
1938 
1939 	return snprintf(buf, 32, "rebuilding block %u of %u\n",
1940 			rbld_buf.ldev_size - rbld_buf.blocks_left,
1941 			rbld_buf.ldev_size);
1942 }
1943 
1944 static ssize_t rebuild_store(struct device *dev,
1945 		struct device_attribute *attr, const char *buf, size_t count)
1946 {
1947 	struct scsi_device *sdev = to_scsi_device(dev);
1948 	struct myrb_hba *cb = shost_priv(sdev->host);
1949 	struct myrb_cmdblk *cmd_blk;
1950 	union myrb_cmd_mbox *mbox;
1951 	unsigned short status;
1952 	int rc, start;
1953 	const char *msg;
1954 
1955 	rc = kstrtoint(buf, 0, &start);
1956 	if (rc)
1957 		return rc;
1958 
1959 	if (sdev->channel >= myrb_logical_channel(sdev->host))
1960 		return -ENXIO;
1961 
1962 	status = myrb_get_rbld_progress(cb, NULL);
1963 	if (start) {
1964 		if (status == MYRB_STATUS_SUCCESS) {
1965 			sdev_printk(KERN_INFO, sdev,
1966 				    "Rebuild Not Initiated; already in progress\n");
1967 			return -EALREADY;
1968 		}
1969 		mutex_lock(&cb->dcmd_mutex);
1970 		cmd_blk = &cb->dcmd_blk;
1971 		myrb_reset_cmd(cmd_blk);
1972 		mbox = &cmd_blk->mbox;
1973 		mbox->type3D.opcode = MYRB_CMD_REBUILD_ASYNC;
1974 		mbox->type3D.id = MYRB_DCMD_TAG;
1975 		mbox->type3D.channel = sdev->channel;
1976 		mbox->type3D.target = sdev->id;
1977 		status = myrb_exec_cmd(cb, cmd_blk);
1978 		mutex_unlock(&cb->dcmd_mutex);
1979 	} else {
1980 		struct pci_dev *pdev = cb->pdev;
1981 		unsigned char *rate;
1982 		dma_addr_t rate_addr;
1983 
1984 		if (status != MYRB_STATUS_SUCCESS) {
1985 			sdev_printk(KERN_INFO, sdev,
1986 				    "Rebuild Not Cancelled; not in progress\n");
1987 			return 0;
1988 		}
1989 
1990 		rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
1991 					  &rate_addr, GFP_KERNEL);
1992 		if (rate == NULL) {
1993 			sdev_printk(KERN_INFO, sdev,
1994 				    "Cancellation of Rebuild Failed - Out of Memory\n");
1995 			return -ENOMEM;
1996 		}
1997 		mutex_lock(&cb->dcmd_mutex);
1998 		cmd_blk = &cb->dcmd_blk;
1999 		myrb_reset_cmd(cmd_blk);
2000 		mbox = &cmd_blk->mbox;
2001 		mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
2002 		mbox->type3R.id = MYRB_DCMD_TAG;
2003 		mbox->type3R.rbld_rate = 0xFF;
2004 		mbox->type3R.addr = rate_addr;
2005 		status = myrb_exec_cmd(cb, cmd_blk);
2006 		dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
2007 		mutex_unlock(&cb->dcmd_mutex);
2008 	}
2009 	if (status == MYRB_STATUS_SUCCESS) {
2010 		sdev_printk(KERN_INFO, sdev, "Rebuild %s\n",
2011 			    start ? "Initiated" : "Cancelled");
2012 		return count;
2013 	}
2014 	if (!start) {
2015 		sdev_printk(KERN_INFO, sdev,
2016 			    "Rebuild Not Cancelled, status 0x%x\n",
2017 			    status);
2018 		return -EIO;
2019 	}
2020 
2021 	switch (status) {
2022 	case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
2023 		msg = "Attempt to Rebuild Online or Unresponsive Drive";
2024 		break;
2025 	case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
2026 		msg = "New Disk Failed During Rebuild";
2027 		break;
2028 	case MYRB_STATUS_INVALID_ADDRESS:
2029 		msg = "Invalid Device Address";
2030 		break;
2031 	case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2032 		msg = "Already in Progress";
2033 		break;
2034 	default:
2035 		msg = NULL;
2036 		break;
2037 	}
2038 	if (msg)
2039 		sdev_printk(KERN_INFO, sdev,
2040 			    "Rebuild Failed - %s\n", msg);
2041 	else
2042 		sdev_printk(KERN_INFO, sdev,
2043 			    "Rebuild Failed, status 0x%x\n", status);
2044 
2045 	return -EIO;
2046 }
2047 static DEVICE_ATTR_RW(rebuild);
2048 
2049 static ssize_t consistency_check_store(struct device *dev,
2050 		struct device_attribute *attr, const char *buf, size_t count)
2051 {
2052 	struct scsi_device *sdev = to_scsi_device(dev);
2053 	struct myrb_hba *cb = shost_priv(sdev->host);
2054 	struct myrb_rbld_progress rbld_buf;
2055 	struct myrb_cmdblk *cmd_blk;
2056 	union myrb_cmd_mbox *mbox;
2057 	unsigned short ldev_num = 0xFFFF;
2058 	unsigned short status;
2059 	int rc, start;
2060 	const char *msg;
2061 
2062 	rc = kstrtoint(buf, 0, &start);
2063 	if (rc)
2064 		return rc;
2065 
2066 	if (sdev->channel < myrb_logical_channel(sdev->host))
2067 		return -ENXIO;
2068 
2069 	status = myrb_get_rbld_progress(cb, &rbld_buf);
2070 	if (start) {
2071 		if (status == MYRB_STATUS_SUCCESS) {
2072 			sdev_printk(KERN_INFO, sdev,
2073 				    "Check Consistency Not Initiated; already in progress\n");
2074 			return -EALREADY;
2075 		}
2076 		mutex_lock(&cb->dcmd_mutex);
2077 		cmd_blk = &cb->dcmd_blk;
2078 		myrb_reset_cmd(cmd_blk);
2079 		mbox = &cmd_blk->mbox;
2080 		mbox->type3C.opcode = MYRB_CMD_CHECK_CONSISTENCY_ASYNC;
2081 		mbox->type3C.id = MYRB_DCMD_TAG;
2082 		mbox->type3C.ldev_num = sdev->id;
2083 		mbox->type3C.auto_restore = true;
2084 
2085 		status = myrb_exec_cmd(cb, cmd_blk);
2086 		mutex_unlock(&cb->dcmd_mutex);
2087 	} else {
2088 		struct pci_dev *pdev = cb->pdev;
2089 		unsigned char *rate;
2090 		dma_addr_t rate_addr;
2091 
2092 		if (ldev_num != sdev->id) {
2093 			sdev_printk(KERN_INFO, sdev,
2094 				    "Check Consistency Not Cancelled; not in progress\n");
2095 			return 0;
2096 		}
2097 		rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
2098 					  &rate_addr, GFP_KERNEL);
2099 		if (rate == NULL) {
2100 			sdev_printk(KERN_INFO, sdev,
2101 				    "Cancellation of Check Consistency Failed - Out of Memory\n");
2102 			return -ENOMEM;
2103 		}
2104 		mutex_lock(&cb->dcmd_mutex);
2105 		cmd_blk = &cb->dcmd_blk;
2106 		myrb_reset_cmd(cmd_blk);
2107 		mbox = &cmd_blk->mbox;
2108 		mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
2109 		mbox->type3R.id = MYRB_DCMD_TAG;
2110 		mbox->type3R.rbld_rate = 0xFF;
2111 		mbox->type3R.addr = rate_addr;
2112 		status = myrb_exec_cmd(cb, cmd_blk);
2113 		dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
2114 		mutex_unlock(&cb->dcmd_mutex);
2115 	}
2116 	if (status == MYRB_STATUS_SUCCESS) {
2117 		sdev_printk(KERN_INFO, sdev, "Check Consistency %s\n",
2118 			    start ? "Initiated" : "Cancelled");
2119 		return count;
2120 	}
2121 	if (!start) {
2122 		sdev_printk(KERN_INFO, sdev,
2123 			    "Check Consistency Not Cancelled, status 0x%x\n",
2124 			    status);
2125 		return -EIO;
2126 	}
2127 
2128 	switch (status) {
2129 	case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
2130 		msg = "Dependent Physical Device is DEAD";
2131 		break;
2132 	case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
2133 		msg = "New Disk Failed During Rebuild";
2134 		break;
2135 	case MYRB_STATUS_INVALID_ADDRESS:
2136 		msg = "Invalid or Nonredundant Logical Drive";
2137 		break;
2138 	case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2139 		msg = "Already in Progress";
2140 		break;
2141 	default:
2142 		msg = NULL;
2143 		break;
2144 	}
2145 	if (msg)
2146 		sdev_printk(KERN_INFO, sdev,
2147 			    "Check Consistency Failed - %s\n", msg);
2148 	else
2149 		sdev_printk(KERN_INFO, sdev,
2150 			    "Check Consistency Failed, status 0x%x\n", status);
2151 
2152 	return -EIO;
2153 }
2154 
2155 static ssize_t consistency_check_show(struct device *dev,
2156 		struct device_attribute *attr, char *buf)
2157 {
2158 	return rebuild_show(dev, attr, buf);
2159 }
2160 static DEVICE_ATTR_RW(consistency_check);
2161 
2162 static ssize_t ctlr_num_show(struct device *dev,
2163 		struct device_attribute *attr, char *buf)
2164 {
2165 	struct Scsi_Host *shost = class_to_shost(dev);
2166 	struct myrb_hba *cb = shost_priv(shost);
2167 
2168 	return snprintf(buf, 20, "%u\n", cb->ctlr_num);
2169 }
2170 static DEVICE_ATTR_RO(ctlr_num);
2171 
2172 static ssize_t firmware_show(struct device *dev,
2173 		struct device_attribute *attr, char *buf)
2174 {
2175 	struct Scsi_Host *shost = class_to_shost(dev);
2176 	struct myrb_hba *cb = shost_priv(shost);
2177 
2178 	return snprintf(buf, 16, "%s\n", cb->fw_version);
2179 }
2180 static DEVICE_ATTR_RO(firmware);
2181 
2182 static ssize_t model_show(struct device *dev,
2183 		struct device_attribute *attr, char *buf)
2184 {
2185 	struct Scsi_Host *shost = class_to_shost(dev);
2186 	struct myrb_hba *cb = shost_priv(shost);
2187 
2188 	return snprintf(buf, 16, "%s\n", cb->model_name);
2189 }
2190 static DEVICE_ATTR_RO(model);
2191 
2192 static ssize_t flush_cache_store(struct device *dev,
2193 		struct device_attribute *attr, const char *buf, size_t count)
2194 {
2195 	struct Scsi_Host *shost = class_to_shost(dev);
2196 	struct myrb_hba *cb = shost_priv(shost);
2197 	unsigned short status;
2198 
2199 	status = myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
2200 	if (status == MYRB_STATUS_SUCCESS) {
2201 		shost_printk(KERN_INFO, shost,
2202 			     "Cache Flush Completed\n");
2203 		return count;
2204 	}
2205 	shost_printk(KERN_INFO, shost,
2206 		     "Cache Flush Failed, status %x\n", status);
2207 	return -EIO;
2208 }
2209 static DEVICE_ATTR_WO(flush_cache);
2210 
2211 static struct device_attribute *myrb_sdev_attrs[] = {
2212 	&dev_attr_rebuild,
2213 	&dev_attr_consistency_check,
2214 	&dev_attr_raid_state,
2215 	&dev_attr_raid_level,
2216 	NULL,
2217 };
2218 
2219 static struct device_attribute *myrb_shost_attrs[] = {
2220 	&dev_attr_ctlr_num,
2221 	&dev_attr_model,
2222 	&dev_attr_firmware,
2223 	&dev_attr_flush_cache,
2224 	NULL,
2225 };
2226 
2227 static struct scsi_host_template myrb_template = {
2228 	.module			= THIS_MODULE,
2229 	.name			= "DAC960",
2230 	.proc_name		= "myrb",
2231 	.queuecommand		= myrb_queuecommand,
2232 	.eh_host_reset_handler	= myrb_host_reset,
2233 	.slave_alloc		= myrb_slave_alloc,
2234 	.slave_configure	= myrb_slave_configure,
2235 	.slave_destroy		= myrb_slave_destroy,
2236 	.bios_param		= myrb_biosparam,
2237 	.cmd_size		= sizeof(struct myrb_cmdblk),
2238 	.shost_attrs		= myrb_shost_attrs,
2239 	.sdev_attrs		= myrb_sdev_attrs,
2240 	.this_id		= -1,
2241 };
2242 
2243 /**
2244  * myrb_is_raid - return boolean indicating device is raid volume
2245  * @dev: the device struct object
2246  */
2247 static int myrb_is_raid(struct device *dev)
2248 {
2249 	struct scsi_device *sdev = to_scsi_device(dev);
2250 
2251 	return sdev->channel == myrb_logical_channel(sdev->host);
2252 }
2253 
2254 /**
2255  * myrb_get_resync - get raid volume resync percent complete
2256  * @dev: the device struct object
2257  */
2258 static void myrb_get_resync(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_rbld_progress rbld_buf;
2263 	unsigned int percent_complete = 0;
2264 	unsigned short status;
2265 	unsigned int ldev_size = 0, remaining = 0;
2266 
2267 	if (sdev->channel < myrb_logical_channel(sdev->host))
2268 		return;
2269 	status = myrb_get_rbld_progress(cb, &rbld_buf);
2270 	if (status == MYRB_STATUS_SUCCESS) {
2271 		if (rbld_buf.ldev_num == sdev->id) {
2272 			ldev_size = rbld_buf.ldev_size;
2273 			remaining = rbld_buf.blocks_left;
2274 		}
2275 	}
2276 	if (remaining && ldev_size)
2277 		percent_complete = (ldev_size - remaining) * 100 / ldev_size;
2278 	raid_set_resync(myrb_raid_template, dev, percent_complete);
2279 }
2280 
2281 /**
2282  * myrb_get_state - get raid volume status
2283  * @dev: the device struct object
2284  */
2285 static void myrb_get_state(struct device *dev)
2286 {
2287 	struct scsi_device *sdev = to_scsi_device(dev);
2288 	struct myrb_hba *cb = shost_priv(sdev->host);
2289 	struct myrb_ldev_info *ldev_info = sdev->hostdata;
2290 	enum raid_state state = RAID_STATE_UNKNOWN;
2291 	unsigned short status;
2292 
2293 	if (sdev->channel < myrb_logical_channel(sdev->host) || !ldev_info)
2294 		state = RAID_STATE_UNKNOWN;
2295 	else {
2296 		status = myrb_get_rbld_progress(cb, NULL);
2297 		if (status == MYRB_STATUS_SUCCESS)
2298 			state = RAID_STATE_RESYNCING;
2299 		else {
2300 			switch (ldev_info->state) {
2301 			case MYRB_DEVICE_ONLINE:
2302 				state = RAID_STATE_ACTIVE;
2303 				break;
2304 			case MYRB_DEVICE_WO:
2305 			case MYRB_DEVICE_CRITICAL:
2306 				state = RAID_STATE_DEGRADED;
2307 				break;
2308 			default:
2309 				state = RAID_STATE_OFFLINE;
2310 			}
2311 		}
2312 	}
2313 	raid_set_state(myrb_raid_template, dev, state);
2314 }
2315 
2316 static struct raid_function_template myrb_raid_functions = {
2317 	.cookie		= &myrb_template,
2318 	.is_raid	= myrb_is_raid,
2319 	.get_resync	= myrb_get_resync,
2320 	.get_state	= myrb_get_state,
2321 };
2322 
2323 static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk,
2324 		struct scsi_cmnd *scmd)
2325 {
2326 	unsigned short status;
2327 
2328 	if (!cmd_blk)
2329 		return;
2330 
2331 	scsi_dma_unmap(scmd);
2332 
2333 	if (cmd_blk->dcdb) {
2334 		memcpy(scmd->sense_buffer, &cmd_blk->dcdb->sense, 64);
2335 		dma_pool_free(cb->dcdb_pool, cmd_blk->dcdb,
2336 			      cmd_blk->dcdb_addr);
2337 		cmd_blk->dcdb = NULL;
2338 	}
2339 	if (cmd_blk->sgl) {
2340 		dma_pool_free(cb->sg_pool, cmd_blk->sgl, cmd_blk->sgl_addr);
2341 		cmd_blk->sgl = NULL;
2342 		cmd_blk->sgl_addr = 0;
2343 	}
2344 	status = cmd_blk->status;
2345 	switch (status) {
2346 	case MYRB_STATUS_SUCCESS:
2347 	case MYRB_STATUS_DEVICE_BUSY:
2348 		scmd->result = (DID_OK << 16) | status;
2349 		break;
2350 	case MYRB_STATUS_BAD_DATA:
2351 		dev_dbg(&scmd->device->sdev_gendev,
2352 			"Bad Data Encountered\n");
2353 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2354 			/* Unrecovered read error */
2355 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2356 						MEDIUM_ERROR, 0x11, 0);
2357 		else
2358 			/* Write error */
2359 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2360 						MEDIUM_ERROR, 0x0C, 0);
2361 		scmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
2362 		break;
2363 	case MYRB_STATUS_IRRECOVERABLE_DATA_ERROR:
2364 		scmd_printk(KERN_ERR, scmd, "Irrecoverable Data Error\n");
2365 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2366 			/* Unrecovered read error, auto-reallocation failed */
2367 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2368 						MEDIUM_ERROR, 0x11, 0x04);
2369 		else
2370 			/* Write error, auto-reallocation failed */
2371 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2372 						MEDIUM_ERROR, 0x0C, 0x02);
2373 		scmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
2374 		break;
2375 	case MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE:
2376 		dev_dbg(&scmd->device->sdev_gendev,
2377 			    "Logical Drive Nonexistent or Offline");
2378 		scmd->result = (DID_BAD_TARGET << 16);
2379 		break;
2380 	case MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV:
2381 		dev_dbg(&scmd->device->sdev_gendev,
2382 			    "Attempt to Access Beyond End of Logical Drive");
2383 		/* Logical block address out of range */
2384 		scsi_build_sense_buffer(0, scmd->sense_buffer,
2385 					NOT_READY, 0x21, 0);
2386 		break;
2387 	case MYRB_STATUS_DEVICE_NONRESPONSIVE:
2388 		dev_dbg(&scmd->device->sdev_gendev, "Device nonresponsive\n");
2389 		scmd->result = (DID_BAD_TARGET << 16);
2390 		break;
2391 	default:
2392 		scmd_printk(KERN_ERR, scmd,
2393 			    "Unexpected Error Status %04X", status);
2394 		scmd->result = (DID_ERROR << 16);
2395 		break;
2396 	}
2397 	scmd->scsi_done(scmd);
2398 }
2399 
2400 static void myrb_handle_cmdblk(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
2401 {
2402 	if (!cmd_blk)
2403 		return;
2404 
2405 	if (cmd_blk->completion) {
2406 		complete(cmd_blk->completion);
2407 		cmd_blk->completion = NULL;
2408 	}
2409 }
2410 
2411 static void myrb_monitor(struct work_struct *work)
2412 {
2413 	struct myrb_hba *cb = container_of(work,
2414 			struct myrb_hba, monitor_work.work);
2415 	struct Scsi_Host *shost = cb->host;
2416 	unsigned long interval = MYRB_PRIMARY_MONITOR_INTERVAL;
2417 
2418 	dev_dbg(&shost->shost_gendev, "monitor tick\n");
2419 
2420 	if (cb->new_ev_seq > cb->old_ev_seq) {
2421 		int event = cb->old_ev_seq;
2422 
2423 		dev_dbg(&shost->shost_gendev,
2424 			"get event log no %d/%d\n",
2425 			cb->new_ev_seq, event);
2426 		myrb_get_event(cb, event);
2427 		cb->old_ev_seq = event + 1;
2428 		interval = 10;
2429 	} else if (cb->need_err_info) {
2430 		cb->need_err_info = false;
2431 		dev_dbg(&shost->shost_gendev, "get error table\n");
2432 		myrb_get_errtable(cb);
2433 		interval = 10;
2434 	} else if (cb->need_rbld && cb->rbld_first) {
2435 		cb->need_rbld = false;
2436 		dev_dbg(&shost->shost_gendev,
2437 			"get rebuild progress\n");
2438 		myrb_update_rbld_progress(cb);
2439 		interval = 10;
2440 	} else if (cb->need_ldev_info) {
2441 		cb->need_ldev_info = false;
2442 		dev_dbg(&shost->shost_gendev,
2443 			"get logical drive info\n");
2444 		myrb_get_ldev_info(cb);
2445 		interval = 10;
2446 	} else if (cb->need_rbld) {
2447 		cb->need_rbld = false;
2448 		dev_dbg(&shost->shost_gendev,
2449 			"get rebuild progress\n");
2450 		myrb_update_rbld_progress(cb);
2451 		interval = 10;
2452 	} else if (cb->need_cc_status) {
2453 		cb->need_cc_status = false;
2454 		dev_dbg(&shost->shost_gendev,
2455 			"get consistency check progress\n");
2456 		myrb_get_cc_progress(cb);
2457 		interval = 10;
2458 	} else if (cb->need_bgi_status) {
2459 		cb->need_bgi_status = false;
2460 		dev_dbg(&shost->shost_gendev, "get background init status\n");
2461 		myrb_bgi_control(cb);
2462 		interval = 10;
2463 	} else {
2464 		dev_dbg(&shost->shost_gendev, "new enquiry\n");
2465 		mutex_lock(&cb->dma_mutex);
2466 		myrb_hba_enquiry(cb);
2467 		mutex_unlock(&cb->dma_mutex);
2468 		if ((cb->new_ev_seq - cb->old_ev_seq > 0) ||
2469 		    cb->need_err_info || cb->need_rbld ||
2470 		    cb->need_ldev_info || cb->need_cc_status ||
2471 		    cb->need_bgi_status) {
2472 			dev_dbg(&shost->shost_gendev,
2473 				"reschedule monitor\n");
2474 			interval = 0;
2475 		}
2476 	}
2477 	if (interval > 1)
2478 		cb->primary_monitor_time = jiffies;
2479 	queue_delayed_work(cb->work_q, &cb->monitor_work, interval);
2480 }
2481 
2482 /*
2483  * myrb_err_status - reports controller BIOS messages
2484  *
2485  * Controller BIOS messages are passed through the Error Status Register
2486  * when the driver performs the BIOS handshaking.
2487  *
2488  * Return: true for fatal errors and false otherwise.
2489  */
2490 static bool myrb_err_status(struct myrb_hba *cb, unsigned char error,
2491 		unsigned char parm0, unsigned char parm1)
2492 {
2493 	struct pci_dev *pdev = cb->pdev;
2494 
2495 	switch (error) {
2496 	case 0x00:
2497 		dev_info(&pdev->dev,
2498 			 "Physical Device %d:%d Not Responding\n",
2499 			 parm1, parm0);
2500 		break;
2501 	case 0x08:
2502 		dev_notice(&pdev->dev, "Spinning Up Drives\n");
2503 		break;
2504 	case 0x30:
2505 		dev_notice(&pdev->dev, "Configuration Checksum Error\n");
2506 		break;
2507 	case 0x60:
2508 		dev_notice(&pdev->dev, "Mirror Race Recovery Failed\n");
2509 		break;
2510 	case 0x70:
2511 		dev_notice(&pdev->dev, "Mirror Race Recovery In Progress\n");
2512 		break;
2513 	case 0x90:
2514 		dev_notice(&pdev->dev, "Physical Device %d:%d COD Mismatch\n",
2515 			   parm1, parm0);
2516 		break;
2517 	case 0xA0:
2518 		dev_notice(&pdev->dev, "Logical Drive Installation Aborted\n");
2519 		break;
2520 	case 0xB0:
2521 		dev_notice(&pdev->dev, "Mirror Race On A Critical Logical Drive\n");
2522 		break;
2523 	case 0xD0:
2524 		dev_notice(&pdev->dev, "New Controller Configuration Found\n");
2525 		break;
2526 	case 0xF0:
2527 		dev_err(&pdev->dev, "Fatal Memory Parity Error\n");
2528 		return true;
2529 	default:
2530 		dev_err(&pdev->dev, "Unknown Initialization Error %02X\n",
2531 			error);
2532 		return true;
2533 	}
2534 	return false;
2535 }
2536 
2537 /*
2538  * Hardware-specific functions
2539  */
2540 
2541 /*
2542  * DAC960 LA Series Controllers
2543  */
2544 
2545 static inline void DAC960_LA_hw_mbox_new_cmd(void __iomem *base)
2546 {
2547 	writeb(DAC960_LA_IDB_HWMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2548 }
2549 
2550 static inline void DAC960_LA_ack_hw_mbox_status(void __iomem *base)
2551 {
2552 	writeb(DAC960_LA_IDB_HWMBOX_ACK_STS, base + DAC960_LA_IDB_OFFSET);
2553 }
2554 
2555 static inline void DAC960_LA_reset_ctrl(void __iomem *base)
2556 {
2557 	writeb(DAC960_LA_IDB_CTRL_RESET, base + DAC960_LA_IDB_OFFSET);
2558 }
2559 
2560 static inline void DAC960_LA_mem_mbox_new_cmd(void __iomem *base)
2561 {
2562 	writeb(DAC960_LA_IDB_MMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2563 }
2564 
2565 static inline bool DAC960_LA_hw_mbox_is_full(void __iomem *base)
2566 {
2567 	unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2568 
2569 	return !(idb & DAC960_LA_IDB_HWMBOX_EMPTY);
2570 }
2571 
2572 static inline bool DAC960_LA_init_in_progress(void __iomem *base)
2573 {
2574 	unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2575 
2576 	return !(idb & DAC960_LA_IDB_INIT_DONE);
2577 }
2578 
2579 static inline void DAC960_LA_ack_hw_mbox_intr(void __iomem *base)
2580 {
2581 	writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET);
2582 }
2583 
2584 static inline void DAC960_LA_ack_intr(void __iomem *base)
2585 {
2586 	writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ | DAC960_LA_ODB_MMBOX_ACK_IRQ,
2587 	       base + DAC960_LA_ODB_OFFSET);
2588 }
2589 
2590 static inline bool DAC960_LA_hw_mbox_status_available(void __iomem *base)
2591 {
2592 	unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET);
2593 
2594 	return odb & DAC960_LA_ODB_HWMBOX_STS_AVAIL;
2595 }
2596 
2597 static inline void DAC960_LA_enable_intr(void __iomem *base)
2598 {
2599 	unsigned char odb = 0xFF;
2600 
2601 	odb &= ~DAC960_LA_IRQMASK_DISABLE_IRQ;
2602 	writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2603 }
2604 
2605 static inline void DAC960_LA_disable_intr(void __iomem *base)
2606 {
2607 	unsigned char odb = 0xFF;
2608 
2609 	odb |= DAC960_LA_IRQMASK_DISABLE_IRQ;
2610 	writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2611 }
2612 
2613 static inline void DAC960_LA_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2614 		union myrb_cmd_mbox *mbox)
2615 {
2616 	mem_mbox->words[1] = mbox->words[1];
2617 	mem_mbox->words[2] = mbox->words[2];
2618 	mem_mbox->words[3] = mbox->words[3];
2619 	/* Memory barrier to prevent reordering */
2620 	wmb();
2621 	mem_mbox->words[0] = mbox->words[0];
2622 	/* Memory barrier to force PCI access */
2623 	mb();
2624 }
2625 
2626 static inline void DAC960_LA_write_hw_mbox(void __iomem *base,
2627 		union myrb_cmd_mbox *mbox)
2628 {
2629 	writel(mbox->words[0], base + DAC960_LA_CMDOP_OFFSET);
2630 	writel(mbox->words[1], base + DAC960_LA_MBOX4_OFFSET);
2631 	writel(mbox->words[2], base + DAC960_LA_MBOX8_OFFSET);
2632 	writeb(mbox->bytes[12], base + DAC960_LA_MBOX12_OFFSET);
2633 }
2634 
2635 static inline unsigned short DAC960_LA_read_status(void __iomem *base)
2636 {
2637 	return readw(base + DAC960_LA_STS_OFFSET);
2638 }
2639 
2640 static inline bool
2641 DAC960_LA_read_error_status(void __iomem *base, unsigned char *error,
2642 		unsigned char *param0, unsigned char *param1)
2643 {
2644 	unsigned char errsts = readb(base + DAC960_LA_ERRSTS_OFFSET);
2645 
2646 	if (!(errsts & DAC960_LA_ERRSTS_PENDING))
2647 		return false;
2648 	errsts &= ~DAC960_LA_ERRSTS_PENDING;
2649 
2650 	*error = errsts;
2651 	*param0 = readb(base + DAC960_LA_CMDOP_OFFSET);
2652 	*param1 = readb(base + DAC960_LA_CMDID_OFFSET);
2653 	writeb(0xFF, base + DAC960_LA_ERRSTS_OFFSET);
2654 	return true;
2655 }
2656 
2657 static inline unsigned short
2658 DAC960_LA_mbox_init(struct pci_dev *pdev, void __iomem *base,
2659 		union myrb_cmd_mbox *mbox)
2660 {
2661 	unsigned short status;
2662 	int timeout = 0;
2663 
2664 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2665 		if (!DAC960_LA_hw_mbox_is_full(base))
2666 			break;
2667 		udelay(10);
2668 		timeout++;
2669 	}
2670 	if (DAC960_LA_hw_mbox_is_full(base)) {
2671 		dev_err(&pdev->dev,
2672 			"Timeout waiting for empty mailbox\n");
2673 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2674 	}
2675 	DAC960_LA_write_hw_mbox(base, mbox);
2676 	DAC960_LA_hw_mbox_new_cmd(base);
2677 	timeout = 0;
2678 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2679 		if (DAC960_LA_hw_mbox_status_available(base))
2680 			break;
2681 		udelay(10);
2682 		timeout++;
2683 	}
2684 	if (!DAC960_LA_hw_mbox_status_available(base)) {
2685 		dev_err(&pdev->dev, "Timeout waiting for mailbox status\n");
2686 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2687 	}
2688 	status = DAC960_LA_read_status(base);
2689 	DAC960_LA_ack_hw_mbox_intr(base);
2690 	DAC960_LA_ack_hw_mbox_status(base);
2691 
2692 	return status;
2693 }
2694 
2695 static int DAC960_LA_hw_init(struct pci_dev *pdev,
2696 		struct myrb_hba *cb, void __iomem *base)
2697 {
2698 	int timeout = 0;
2699 	unsigned char error, parm0, parm1;
2700 
2701 	DAC960_LA_disable_intr(base);
2702 	DAC960_LA_ack_hw_mbox_status(base);
2703 	udelay(1000);
2704 	while (DAC960_LA_init_in_progress(base) &&
2705 	       timeout < MYRB_MAILBOX_TIMEOUT) {
2706 		if (DAC960_LA_read_error_status(base, &error,
2707 					      &parm0, &parm1) &&
2708 		    myrb_err_status(cb, error, parm0, parm1))
2709 			return -ENODEV;
2710 		udelay(10);
2711 		timeout++;
2712 	}
2713 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
2714 		dev_err(&pdev->dev,
2715 			"Timeout waiting for Controller Initialisation\n");
2716 		return -ETIMEDOUT;
2717 	}
2718 	if (!myrb_enable_mmio(cb, DAC960_LA_mbox_init)) {
2719 		dev_err(&pdev->dev,
2720 			"Unable to Enable Memory Mailbox Interface\n");
2721 		DAC960_LA_reset_ctrl(base);
2722 		return -ENODEV;
2723 	}
2724 	DAC960_LA_enable_intr(base);
2725 	cb->qcmd = myrb_qcmd;
2726 	cb->write_cmd_mbox = DAC960_LA_write_cmd_mbox;
2727 	if (cb->dual_mode_interface)
2728 		cb->get_cmd_mbox = DAC960_LA_mem_mbox_new_cmd;
2729 	else
2730 		cb->get_cmd_mbox = DAC960_LA_hw_mbox_new_cmd;
2731 	cb->disable_intr = DAC960_LA_disable_intr;
2732 	cb->reset = DAC960_LA_reset_ctrl;
2733 
2734 	return 0;
2735 }
2736 
2737 static irqreturn_t DAC960_LA_intr_handler(int irq, void *arg)
2738 {
2739 	struct myrb_hba *cb = arg;
2740 	void __iomem *base = cb->io_base;
2741 	struct myrb_stat_mbox *next_stat_mbox;
2742 	unsigned long flags;
2743 
2744 	spin_lock_irqsave(&cb->queue_lock, flags);
2745 	DAC960_LA_ack_intr(base);
2746 	next_stat_mbox = cb->next_stat_mbox;
2747 	while (next_stat_mbox->valid) {
2748 		unsigned char id = next_stat_mbox->id;
2749 		struct scsi_cmnd *scmd = NULL;
2750 		struct myrb_cmdblk *cmd_blk = NULL;
2751 
2752 		if (id == MYRB_DCMD_TAG)
2753 			cmd_blk = &cb->dcmd_blk;
2754 		else if (id == MYRB_MCMD_TAG)
2755 			cmd_blk = &cb->mcmd_blk;
2756 		else {
2757 			scmd = scsi_host_find_tag(cb->host, id - 3);
2758 			if (scmd)
2759 				cmd_blk = scsi_cmd_priv(scmd);
2760 		}
2761 		if (cmd_blk)
2762 			cmd_blk->status = next_stat_mbox->status;
2763 		else
2764 			dev_err(&cb->pdev->dev,
2765 				"Unhandled command completion %d\n", id);
2766 
2767 		memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
2768 		if (++next_stat_mbox > cb->last_stat_mbox)
2769 			next_stat_mbox = cb->first_stat_mbox;
2770 
2771 		if (cmd_blk) {
2772 			if (id < 3)
2773 				myrb_handle_cmdblk(cb, cmd_blk);
2774 			else
2775 				myrb_handle_scsi(cb, cmd_blk, scmd);
2776 		}
2777 	}
2778 	cb->next_stat_mbox = next_stat_mbox;
2779 	spin_unlock_irqrestore(&cb->queue_lock, flags);
2780 	return IRQ_HANDLED;
2781 }
2782 
2783 static struct myrb_privdata DAC960_LA_privdata = {
2784 	.hw_init =	DAC960_LA_hw_init,
2785 	.irq_handler =	DAC960_LA_intr_handler,
2786 	.mmio_size =	DAC960_LA_mmio_size,
2787 };
2788 
2789 /*
2790  * DAC960 PG Series Controllers
2791  */
2792 static inline void DAC960_PG_hw_mbox_new_cmd(void __iomem *base)
2793 {
2794 	writel(DAC960_PG_IDB_HWMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2795 }
2796 
2797 static inline void DAC960_PG_ack_hw_mbox_status(void __iomem *base)
2798 {
2799 	writel(DAC960_PG_IDB_HWMBOX_ACK_STS, base + DAC960_PG_IDB_OFFSET);
2800 }
2801 
2802 static inline void DAC960_PG_reset_ctrl(void __iomem *base)
2803 {
2804 	writel(DAC960_PG_IDB_CTRL_RESET, base + DAC960_PG_IDB_OFFSET);
2805 }
2806 
2807 static inline void DAC960_PG_mem_mbox_new_cmd(void __iomem *base)
2808 {
2809 	writel(DAC960_PG_IDB_MMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2810 }
2811 
2812 static inline bool DAC960_PG_hw_mbox_is_full(void __iomem *base)
2813 {
2814 	unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2815 
2816 	return idb & DAC960_PG_IDB_HWMBOX_FULL;
2817 }
2818 
2819 static inline bool DAC960_PG_init_in_progress(void __iomem *base)
2820 {
2821 	unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2822 
2823 	return idb & DAC960_PG_IDB_INIT_IN_PROGRESS;
2824 }
2825 
2826 static inline void DAC960_PG_ack_hw_mbox_intr(void __iomem *base)
2827 {
2828 	writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET);
2829 }
2830 
2831 static inline void DAC960_PG_ack_intr(void __iomem *base)
2832 {
2833 	writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ | DAC960_PG_ODB_MMBOX_ACK_IRQ,
2834 	       base + DAC960_PG_ODB_OFFSET);
2835 }
2836 
2837 static inline bool DAC960_PG_hw_mbox_status_available(void __iomem *base)
2838 {
2839 	unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET);
2840 
2841 	return odb & DAC960_PG_ODB_HWMBOX_STS_AVAIL;
2842 }
2843 
2844 static inline void DAC960_PG_enable_intr(void __iomem *base)
2845 {
2846 	unsigned int imask = (unsigned int)-1;
2847 
2848 	imask &= ~DAC960_PG_IRQMASK_DISABLE_IRQ;
2849 	writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2850 }
2851 
2852 static inline void DAC960_PG_disable_intr(void __iomem *base)
2853 {
2854 	unsigned int imask = (unsigned int)-1;
2855 
2856 	writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2857 }
2858 
2859 static inline void DAC960_PG_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2860 		union myrb_cmd_mbox *mbox)
2861 {
2862 	mem_mbox->words[1] = mbox->words[1];
2863 	mem_mbox->words[2] = mbox->words[2];
2864 	mem_mbox->words[3] = mbox->words[3];
2865 	/* Memory barrier to prevent reordering */
2866 	wmb();
2867 	mem_mbox->words[0] = mbox->words[0];
2868 	/* Memory barrier to force PCI access */
2869 	mb();
2870 }
2871 
2872 static inline void DAC960_PG_write_hw_mbox(void __iomem *base,
2873 		union myrb_cmd_mbox *mbox)
2874 {
2875 	writel(mbox->words[0], base + DAC960_PG_CMDOP_OFFSET);
2876 	writel(mbox->words[1], base + DAC960_PG_MBOX4_OFFSET);
2877 	writel(mbox->words[2], base + DAC960_PG_MBOX8_OFFSET);
2878 	writeb(mbox->bytes[12], base + DAC960_PG_MBOX12_OFFSET);
2879 }
2880 
2881 static inline unsigned short
2882 DAC960_PG_read_status(void __iomem *base)
2883 {
2884 	return readw(base + DAC960_PG_STS_OFFSET);
2885 }
2886 
2887 static inline bool
2888 DAC960_PG_read_error_status(void __iomem *base, unsigned char *error,
2889 		unsigned char *param0, unsigned char *param1)
2890 {
2891 	unsigned char errsts = readb(base + DAC960_PG_ERRSTS_OFFSET);
2892 
2893 	if (!(errsts & DAC960_PG_ERRSTS_PENDING))
2894 		return false;
2895 	errsts &= ~DAC960_PG_ERRSTS_PENDING;
2896 	*error = errsts;
2897 	*param0 = readb(base + DAC960_PG_CMDOP_OFFSET);
2898 	*param1 = readb(base + DAC960_PG_CMDID_OFFSET);
2899 	writeb(0, base + DAC960_PG_ERRSTS_OFFSET);
2900 	return true;
2901 }
2902 
2903 static inline unsigned short
2904 DAC960_PG_mbox_init(struct pci_dev *pdev, void __iomem *base,
2905 		union myrb_cmd_mbox *mbox)
2906 {
2907 	unsigned short status;
2908 	int timeout = 0;
2909 
2910 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2911 		if (!DAC960_PG_hw_mbox_is_full(base))
2912 			break;
2913 		udelay(10);
2914 		timeout++;
2915 	}
2916 	if (DAC960_PG_hw_mbox_is_full(base)) {
2917 		dev_err(&pdev->dev,
2918 			"Timeout waiting for empty mailbox\n");
2919 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2920 	}
2921 	DAC960_PG_write_hw_mbox(base, mbox);
2922 	DAC960_PG_hw_mbox_new_cmd(base);
2923 
2924 	timeout = 0;
2925 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2926 		if (DAC960_PG_hw_mbox_status_available(base))
2927 			break;
2928 		udelay(10);
2929 		timeout++;
2930 	}
2931 	if (!DAC960_PG_hw_mbox_status_available(base)) {
2932 		dev_err(&pdev->dev,
2933 			"Timeout waiting for mailbox status\n");
2934 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2935 	}
2936 	status = DAC960_PG_read_status(base);
2937 	DAC960_PG_ack_hw_mbox_intr(base);
2938 	DAC960_PG_ack_hw_mbox_status(base);
2939 
2940 	return status;
2941 }
2942 
2943 static int DAC960_PG_hw_init(struct pci_dev *pdev,
2944 		struct myrb_hba *cb, void __iomem *base)
2945 {
2946 	int timeout = 0;
2947 	unsigned char error, parm0, parm1;
2948 
2949 	DAC960_PG_disable_intr(base);
2950 	DAC960_PG_ack_hw_mbox_status(base);
2951 	udelay(1000);
2952 	while (DAC960_PG_init_in_progress(base) &&
2953 	       timeout < MYRB_MAILBOX_TIMEOUT) {
2954 		if (DAC960_PG_read_error_status(base, &error,
2955 						&parm0, &parm1) &&
2956 		    myrb_err_status(cb, error, parm0, parm1))
2957 			return -EIO;
2958 		udelay(10);
2959 		timeout++;
2960 	}
2961 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
2962 		dev_err(&pdev->dev,
2963 			"Timeout waiting for Controller Initialisation\n");
2964 		return -ETIMEDOUT;
2965 	}
2966 	if (!myrb_enable_mmio(cb, DAC960_PG_mbox_init)) {
2967 		dev_err(&pdev->dev,
2968 			"Unable to Enable Memory Mailbox Interface\n");
2969 		DAC960_PG_reset_ctrl(base);
2970 		return -ENODEV;
2971 	}
2972 	DAC960_PG_enable_intr(base);
2973 	cb->qcmd = myrb_qcmd;
2974 	cb->write_cmd_mbox = DAC960_PG_write_cmd_mbox;
2975 	if (cb->dual_mode_interface)
2976 		cb->get_cmd_mbox = DAC960_PG_mem_mbox_new_cmd;
2977 	else
2978 		cb->get_cmd_mbox = DAC960_PG_hw_mbox_new_cmd;
2979 	cb->disable_intr = DAC960_PG_disable_intr;
2980 	cb->reset = DAC960_PG_reset_ctrl;
2981 
2982 	return 0;
2983 }
2984 
2985 static irqreturn_t DAC960_PG_intr_handler(int irq, void *arg)
2986 {
2987 	struct myrb_hba *cb = arg;
2988 	void __iomem *base = cb->io_base;
2989 	struct myrb_stat_mbox *next_stat_mbox;
2990 	unsigned long flags;
2991 
2992 	spin_lock_irqsave(&cb->queue_lock, flags);
2993 	DAC960_PG_ack_intr(base);
2994 	next_stat_mbox = cb->next_stat_mbox;
2995 	while (next_stat_mbox->valid) {
2996 		unsigned char id = next_stat_mbox->id;
2997 		struct scsi_cmnd *scmd = NULL;
2998 		struct myrb_cmdblk *cmd_blk = NULL;
2999 
3000 		if (id == MYRB_DCMD_TAG)
3001 			cmd_blk = &cb->dcmd_blk;
3002 		else if (id == MYRB_MCMD_TAG)
3003 			cmd_blk = &cb->mcmd_blk;
3004 		else {
3005 			scmd = scsi_host_find_tag(cb->host, id - 3);
3006 			if (scmd)
3007 				cmd_blk = scsi_cmd_priv(scmd);
3008 		}
3009 		if (cmd_blk)
3010 			cmd_blk->status = next_stat_mbox->status;
3011 		else
3012 			dev_err(&cb->pdev->dev,
3013 				"Unhandled command completion %d\n", id);
3014 
3015 		memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
3016 		if (++next_stat_mbox > cb->last_stat_mbox)
3017 			next_stat_mbox = cb->first_stat_mbox;
3018 
3019 		if (id < 3)
3020 			myrb_handle_cmdblk(cb, cmd_blk);
3021 		else
3022 			myrb_handle_scsi(cb, cmd_blk, scmd);
3023 	}
3024 	cb->next_stat_mbox = next_stat_mbox;
3025 	spin_unlock_irqrestore(&cb->queue_lock, flags);
3026 	return IRQ_HANDLED;
3027 }
3028 
3029 static struct myrb_privdata DAC960_PG_privdata = {
3030 	.hw_init =	DAC960_PG_hw_init,
3031 	.irq_handler =	DAC960_PG_intr_handler,
3032 	.mmio_size =	DAC960_PG_mmio_size,
3033 };
3034 
3035 
3036 /*
3037  * DAC960 PD Series Controllers
3038  */
3039 
3040 static inline void DAC960_PD_hw_mbox_new_cmd(void __iomem *base)
3041 {
3042 	writeb(DAC960_PD_IDB_HWMBOX_NEW_CMD, base + DAC960_PD_IDB_OFFSET);
3043 }
3044 
3045 static inline void DAC960_PD_ack_hw_mbox_status(void __iomem *base)
3046 {
3047 	writeb(DAC960_PD_IDB_HWMBOX_ACK_STS, base + DAC960_PD_IDB_OFFSET);
3048 }
3049 
3050 static inline void DAC960_PD_reset_ctrl(void __iomem *base)
3051 {
3052 	writeb(DAC960_PD_IDB_CTRL_RESET, base + DAC960_PD_IDB_OFFSET);
3053 }
3054 
3055 static inline bool DAC960_PD_hw_mbox_is_full(void __iomem *base)
3056 {
3057 	unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3058 
3059 	return idb & DAC960_PD_IDB_HWMBOX_FULL;
3060 }
3061 
3062 static inline bool DAC960_PD_init_in_progress(void __iomem *base)
3063 {
3064 	unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3065 
3066 	return idb & DAC960_PD_IDB_INIT_IN_PROGRESS;
3067 }
3068 
3069 static inline void DAC960_PD_ack_intr(void __iomem *base)
3070 {
3071 	writeb(DAC960_PD_ODB_HWMBOX_ACK_IRQ, base + DAC960_PD_ODB_OFFSET);
3072 }
3073 
3074 static inline bool DAC960_PD_hw_mbox_status_available(void __iomem *base)
3075 {
3076 	unsigned char odb = readb(base + DAC960_PD_ODB_OFFSET);
3077 
3078 	return odb & DAC960_PD_ODB_HWMBOX_STS_AVAIL;
3079 }
3080 
3081 static inline void DAC960_PD_enable_intr(void __iomem *base)
3082 {
3083 	writeb(DAC960_PD_IRQMASK_ENABLE_IRQ, base + DAC960_PD_IRQEN_OFFSET);
3084 }
3085 
3086 static inline void DAC960_PD_disable_intr(void __iomem *base)
3087 {
3088 	writeb(0, base + DAC960_PD_IRQEN_OFFSET);
3089 }
3090 
3091 static inline void DAC960_PD_write_cmd_mbox(void __iomem *base,
3092 		union myrb_cmd_mbox *mbox)
3093 {
3094 	writel(mbox->words[0], base + DAC960_PD_CMDOP_OFFSET);
3095 	writel(mbox->words[1], base + DAC960_PD_MBOX4_OFFSET);
3096 	writel(mbox->words[2], base + DAC960_PD_MBOX8_OFFSET);
3097 	writeb(mbox->bytes[12], base + DAC960_PD_MBOX12_OFFSET);
3098 }
3099 
3100 static inline unsigned char
3101 DAC960_PD_read_status_cmd_ident(void __iomem *base)
3102 {
3103 	return readb(base + DAC960_PD_STSID_OFFSET);
3104 }
3105 
3106 static inline unsigned short
3107 DAC960_PD_read_status(void __iomem *base)
3108 {
3109 	return readw(base + DAC960_PD_STS_OFFSET);
3110 }
3111 
3112 static inline bool
3113 DAC960_PD_read_error_status(void __iomem *base, unsigned char *error,
3114 		unsigned char *param0, unsigned char *param1)
3115 {
3116 	unsigned char errsts = readb(base + DAC960_PD_ERRSTS_OFFSET);
3117 
3118 	if (!(errsts & DAC960_PD_ERRSTS_PENDING))
3119 		return false;
3120 	errsts &= ~DAC960_PD_ERRSTS_PENDING;
3121 	*error = errsts;
3122 	*param0 = readb(base + DAC960_PD_CMDOP_OFFSET);
3123 	*param1 = readb(base + DAC960_PD_CMDID_OFFSET);
3124 	writeb(0, base + DAC960_PD_ERRSTS_OFFSET);
3125 	return true;
3126 }
3127 
3128 static void DAC960_PD_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3129 {
3130 	void __iomem *base = cb->io_base;
3131 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3132 
3133 	while (DAC960_PD_hw_mbox_is_full(base))
3134 		udelay(1);
3135 	DAC960_PD_write_cmd_mbox(base, mbox);
3136 	DAC960_PD_hw_mbox_new_cmd(base);
3137 }
3138 
3139 static int DAC960_PD_hw_init(struct pci_dev *pdev,
3140 		struct myrb_hba *cb, void __iomem *base)
3141 {
3142 	int timeout = 0;
3143 	unsigned char error, parm0, parm1;
3144 
3145 	if (!request_region(cb->io_addr, 0x80, "myrb")) {
3146 		dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3147 			(unsigned long)cb->io_addr);
3148 		return -EBUSY;
3149 	}
3150 	DAC960_PD_disable_intr(base);
3151 	DAC960_PD_ack_hw_mbox_status(base);
3152 	udelay(1000);
3153 	while (DAC960_PD_init_in_progress(base) &&
3154 	       timeout < MYRB_MAILBOX_TIMEOUT) {
3155 		if (DAC960_PD_read_error_status(base, &error,
3156 					      &parm0, &parm1) &&
3157 		    myrb_err_status(cb, error, parm0, parm1))
3158 			return -EIO;
3159 		udelay(10);
3160 		timeout++;
3161 	}
3162 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
3163 		dev_err(&pdev->dev,
3164 			"Timeout waiting for Controller Initialisation\n");
3165 		return -ETIMEDOUT;
3166 	}
3167 	if (!myrb_enable_mmio(cb, NULL)) {
3168 		dev_err(&pdev->dev,
3169 			"Unable to Enable Memory Mailbox Interface\n");
3170 		DAC960_PD_reset_ctrl(base);
3171 		return -ENODEV;
3172 	}
3173 	DAC960_PD_enable_intr(base);
3174 	cb->qcmd = DAC960_PD_qcmd;
3175 	cb->disable_intr = DAC960_PD_disable_intr;
3176 	cb->reset = DAC960_PD_reset_ctrl;
3177 
3178 	return 0;
3179 }
3180 
3181 static irqreturn_t DAC960_PD_intr_handler(int irq, void *arg)
3182 {
3183 	struct myrb_hba *cb = arg;
3184 	void __iomem *base = cb->io_base;
3185 	unsigned long flags;
3186 
3187 	spin_lock_irqsave(&cb->queue_lock, flags);
3188 	while (DAC960_PD_hw_mbox_status_available(base)) {
3189 		unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3190 		struct scsi_cmnd *scmd = NULL;
3191 		struct myrb_cmdblk *cmd_blk = NULL;
3192 
3193 		if (id == MYRB_DCMD_TAG)
3194 			cmd_blk = &cb->dcmd_blk;
3195 		else if (id == MYRB_MCMD_TAG)
3196 			cmd_blk = &cb->mcmd_blk;
3197 		else {
3198 			scmd = scsi_host_find_tag(cb->host, id - 3);
3199 			if (scmd)
3200 				cmd_blk = scsi_cmd_priv(scmd);
3201 		}
3202 		if (cmd_blk)
3203 			cmd_blk->status = DAC960_PD_read_status(base);
3204 		else
3205 			dev_err(&cb->pdev->dev,
3206 				"Unhandled command completion %d\n", id);
3207 
3208 		DAC960_PD_ack_intr(base);
3209 		DAC960_PD_ack_hw_mbox_status(base);
3210 
3211 		if (id < 3)
3212 			myrb_handle_cmdblk(cb, cmd_blk);
3213 		else
3214 			myrb_handle_scsi(cb, cmd_blk, scmd);
3215 	}
3216 	spin_unlock_irqrestore(&cb->queue_lock, flags);
3217 	return IRQ_HANDLED;
3218 }
3219 
3220 static struct myrb_privdata DAC960_PD_privdata = {
3221 	.hw_init =	DAC960_PD_hw_init,
3222 	.irq_handler =	DAC960_PD_intr_handler,
3223 	.mmio_size =	DAC960_PD_mmio_size,
3224 };
3225 
3226 
3227 /*
3228  * DAC960 P Series Controllers
3229  *
3230  * Similar to the DAC960 PD Series Controllers, but some commands have
3231  * to be translated.
3232  */
3233 
3234 static inline void myrb_translate_enquiry(void *enq)
3235 {
3236 	memcpy(enq + 132, enq + 36, 64);
3237 	memset(enq + 36, 0, 96);
3238 }
3239 
3240 static inline void myrb_translate_devstate(void *state)
3241 {
3242 	memcpy(state + 2, state + 3, 1);
3243 	memmove(state + 4, state + 5, 2);
3244 	memmove(state + 6, state + 8, 4);
3245 }
3246 
3247 static inline void myrb_translate_to_rw_command(struct myrb_cmdblk *cmd_blk)
3248 {
3249 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3250 	int ldev_num = mbox->type5.ld.ldev_num;
3251 
3252 	mbox->bytes[3] &= 0x7;
3253 	mbox->bytes[3] |= mbox->bytes[7] << 6;
3254 	mbox->bytes[7] = ldev_num;
3255 }
3256 
3257 static inline void myrb_translate_from_rw_command(struct myrb_cmdblk *cmd_blk)
3258 {
3259 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3260 	int ldev_num = mbox->bytes[7];
3261 
3262 	mbox->bytes[7] = mbox->bytes[3] >> 6;
3263 	mbox->bytes[3] &= 0x7;
3264 	mbox->bytes[3] |= ldev_num << 3;
3265 }
3266 
3267 static void DAC960_P_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3268 {
3269 	void __iomem *base = cb->io_base;
3270 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3271 
3272 	switch (mbox->common.opcode) {
3273 	case MYRB_CMD_ENQUIRY:
3274 		mbox->common.opcode = MYRB_CMD_ENQUIRY_OLD;
3275 		break;
3276 	case MYRB_CMD_GET_DEVICE_STATE:
3277 		mbox->common.opcode = MYRB_CMD_GET_DEVICE_STATE_OLD;
3278 		break;
3279 	case MYRB_CMD_READ:
3280 		mbox->common.opcode = MYRB_CMD_READ_OLD;
3281 		myrb_translate_to_rw_command(cmd_blk);
3282 		break;
3283 	case MYRB_CMD_WRITE:
3284 		mbox->common.opcode = MYRB_CMD_WRITE_OLD;
3285 		myrb_translate_to_rw_command(cmd_blk);
3286 		break;
3287 	case MYRB_CMD_READ_SG:
3288 		mbox->common.opcode = MYRB_CMD_READ_SG_OLD;
3289 		myrb_translate_to_rw_command(cmd_blk);
3290 		break;
3291 	case MYRB_CMD_WRITE_SG:
3292 		mbox->common.opcode = MYRB_CMD_WRITE_SG_OLD;
3293 		myrb_translate_to_rw_command(cmd_blk);
3294 		break;
3295 	default:
3296 		break;
3297 	}
3298 	while (DAC960_PD_hw_mbox_is_full(base))
3299 		udelay(1);
3300 	DAC960_PD_write_cmd_mbox(base, mbox);
3301 	DAC960_PD_hw_mbox_new_cmd(base);
3302 }
3303 
3304 
3305 static int DAC960_P_hw_init(struct pci_dev *pdev,
3306 		struct myrb_hba *cb, void __iomem *base)
3307 {
3308 	int timeout = 0;
3309 	unsigned char error, parm0, parm1;
3310 
3311 	if (!request_region(cb->io_addr, 0x80, "myrb")) {
3312 		dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3313 			(unsigned long)cb->io_addr);
3314 		return -EBUSY;
3315 	}
3316 	DAC960_PD_disable_intr(base);
3317 	DAC960_PD_ack_hw_mbox_status(base);
3318 	udelay(1000);
3319 	while (DAC960_PD_init_in_progress(base) &&
3320 	       timeout < MYRB_MAILBOX_TIMEOUT) {
3321 		if (DAC960_PD_read_error_status(base, &error,
3322 						&parm0, &parm1) &&
3323 		    myrb_err_status(cb, error, parm0, parm1))
3324 			return -EAGAIN;
3325 		udelay(10);
3326 		timeout++;
3327 	}
3328 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
3329 		dev_err(&pdev->dev,
3330 			"Timeout waiting for Controller Initialisation\n");
3331 		return -ETIMEDOUT;
3332 	}
3333 	if (!myrb_enable_mmio(cb, NULL)) {
3334 		dev_err(&pdev->dev,
3335 			"Unable to allocate DMA mapped memory\n");
3336 		DAC960_PD_reset_ctrl(base);
3337 		return -ETIMEDOUT;
3338 	}
3339 	DAC960_PD_enable_intr(base);
3340 	cb->qcmd = DAC960_P_qcmd;
3341 	cb->disable_intr = DAC960_PD_disable_intr;
3342 	cb->reset = DAC960_PD_reset_ctrl;
3343 
3344 	return 0;
3345 }
3346 
3347 static irqreturn_t DAC960_P_intr_handler(int irq, void *arg)
3348 {
3349 	struct myrb_hba *cb = arg;
3350 	void __iomem *base = cb->io_base;
3351 	unsigned long flags;
3352 
3353 	spin_lock_irqsave(&cb->queue_lock, flags);
3354 	while (DAC960_PD_hw_mbox_status_available(base)) {
3355 		unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3356 		struct scsi_cmnd *scmd = NULL;
3357 		struct myrb_cmdblk *cmd_blk = NULL;
3358 		union myrb_cmd_mbox *mbox;
3359 		enum myrb_cmd_opcode op;
3360 
3361 
3362 		if (id == MYRB_DCMD_TAG)
3363 			cmd_blk = &cb->dcmd_blk;
3364 		else if (id == MYRB_MCMD_TAG)
3365 			cmd_blk = &cb->mcmd_blk;
3366 		else {
3367 			scmd = scsi_host_find_tag(cb->host, id - 3);
3368 			if (scmd)
3369 				cmd_blk = scsi_cmd_priv(scmd);
3370 		}
3371 		if (cmd_blk)
3372 			cmd_blk->status = DAC960_PD_read_status(base);
3373 		else
3374 			dev_err(&cb->pdev->dev,
3375 				"Unhandled command completion %d\n", id);
3376 
3377 		DAC960_PD_ack_intr(base);
3378 		DAC960_PD_ack_hw_mbox_status(base);
3379 
3380 		if (!cmd_blk)
3381 			continue;
3382 
3383 		mbox = &cmd_blk->mbox;
3384 		op = mbox->common.opcode;
3385 		switch (op) {
3386 		case MYRB_CMD_ENQUIRY_OLD:
3387 			mbox->common.opcode = MYRB_CMD_ENQUIRY;
3388 			myrb_translate_enquiry(cb->enquiry);
3389 			break;
3390 		case MYRB_CMD_READ_OLD:
3391 			mbox->common.opcode = MYRB_CMD_READ;
3392 			myrb_translate_from_rw_command(cmd_blk);
3393 			break;
3394 		case MYRB_CMD_WRITE_OLD:
3395 			mbox->common.opcode = MYRB_CMD_WRITE;
3396 			myrb_translate_from_rw_command(cmd_blk);
3397 			break;
3398 		case MYRB_CMD_READ_SG_OLD:
3399 			mbox->common.opcode = MYRB_CMD_READ_SG;
3400 			myrb_translate_from_rw_command(cmd_blk);
3401 			break;
3402 		case MYRB_CMD_WRITE_SG_OLD:
3403 			mbox->common.opcode = MYRB_CMD_WRITE_SG;
3404 			myrb_translate_from_rw_command(cmd_blk);
3405 			break;
3406 		default:
3407 			break;
3408 		}
3409 		if (id < 3)
3410 			myrb_handle_cmdblk(cb, cmd_blk);
3411 		else
3412 			myrb_handle_scsi(cb, cmd_blk, scmd);
3413 	}
3414 	spin_unlock_irqrestore(&cb->queue_lock, flags);
3415 	return IRQ_HANDLED;
3416 }
3417 
3418 static struct myrb_privdata DAC960_P_privdata = {
3419 	.hw_init =	DAC960_P_hw_init,
3420 	.irq_handler =	DAC960_P_intr_handler,
3421 	.mmio_size =	DAC960_PD_mmio_size,
3422 };
3423 
3424 static struct myrb_hba *myrb_detect(struct pci_dev *pdev,
3425 		const struct pci_device_id *entry)
3426 {
3427 	struct myrb_privdata *privdata =
3428 		(struct myrb_privdata *)entry->driver_data;
3429 	irq_handler_t irq_handler = privdata->irq_handler;
3430 	unsigned int mmio_size = privdata->mmio_size;
3431 	struct Scsi_Host *shost;
3432 	struct myrb_hba *cb = NULL;
3433 
3434 	shost = scsi_host_alloc(&myrb_template, sizeof(struct myrb_hba));
3435 	if (!shost) {
3436 		dev_err(&pdev->dev, "Unable to allocate Controller\n");
3437 		return NULL;
3438 	}
3439 	shost->max_cmd_len = 12;
3440 	shost->max_lun = 256;
3441 	cb = shost_priv(shost);
3442 	mutex_init(&cb->dcmd_mutex);
3443 	mutex_init(&cb->dma_mutex);
3444 	cb->pdev = pdev;
3445 
3446 	if (pci_enable_device(pdev))
3447 		goto failure;
3448 
3449 	if (privdata->hw_init == DAC960_PD_hw_init ||
3450 	    privdata->hw_init == DAC960_P_hw_init) {
3451 		cb->io_addr = pci_resource_start(pdev, 0);
3452 		cb->pci_addr = pci_resource_start(pdev, 1);
3453 	} else
3454 		cb->pci_addr = pci_resource_start(pdev, 0);
3455 
3456 	pci_set_drvdata(pdev, cb);
3457 	spin_lock_init(&cb->queue_lock);
3458 	if (mmio_size < PAGE_SIZE)
3459 		mmio_size = PAGE_SIZE;
3460 	cb->mmio_base = ioremap(cb->pci_addr & PAGE_MASK, mmio_size);
3461 	if (cb->mmio_base == NULL) {
3462 		dev_err(&pdev->dev,
3463 			"Unable to map Controller Register Window\n");
3464 		goto failure;
3465 	}
3466 
3467 	cb->io_base = cb->mmio_base + (cb->pci_addr & ~PAGE_MASK);
3468 	if (privdata->hw_init(pdev, cb, cb->io_base))
3469 		goto failure;
3470 
3471 	if (request_irq(pdev->irq, irq_handler, IRQF_SHARED, "myrb", cb) < 0) {
3472 		dev_err(&pdev->dev,
3473 			"Unable to acquire IRQ Channel %d\n", pdev->irq);
3474 		goto failure;
3475 	}
3476 	cb->irq = pdev->irq;
3477 	return cb;
3478 
3479 failure:
3480 	dev_err(&pdev->dev,
3481 		"Failed to initialize Controller\n");
3482 	myrb_cleanup(cb);
3483 	return NULL;
3484 }
3485 
3486 static int myrb_probe(struct pci_dev *dev, const struct pci_device_id *entry)
3487 {
3488 	struct myrb_hba *cb;
3489 	int ret;
3490 
3491 	cb = myrb_detect(dev, entry);
3492 	if (!cb)
3493 		return -ENODEV;
3494 
3495 	ret = myrb_get_hba_config(cb);
3496 	if (ret < 0) {
3497 		myrb_cleanup(cb);
3498 		return ret;
3499 	}
3500 
3501 	if (!myrb_create_mempools(dev, cb)) {
3502 		ret = -ENOMEM;
3503 		goto failed;
3504 	}
3505 
3506 	ret = scsi_add_host(cb->host, &dev->dev);
3507 	if (ret) {
3508 		dev_err(&dev->dev, "scsi_add_host failed with %d\n", ret);
3509 		myrb_destroy_mempools(cb);
3510 		goto failed;
3511 	}
3512 	scsi_scan_host(cb->host);
3513 	return 0;
3514 failed:
3515 	myrb_cleanup(cb);
3516 	return ret;
3517 }
3518 
3519 
3520 static void myrb_remove(struct pci_dev *pdev)
3521 {
3522 	struct myrb_hba *cb = pci_get_drvdata(pdev);
3523 
3524 	shost_printk(KERN_NOTICE, cb->host, "Flushing Cache...");
3525 	myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
3526 	myrb_cleanup(cb);
3527 	myrb_destroy_mempools(cb);
3528 }
3529 
3530 
3531 static const struct pci_device_id myrb_id_table[] = {
3532 	{
3533 		PCI_DEVICE_SUB(PCI_VENDOR_ID_DEC,
3534 			       PCI_DEVICE_ID_DEC_21285,
3535 			       PCI_VENDOR_ID_MYLEX,
3536 			       PCI_DEVICE_ID_MYLEX_DAC960_LA),
3537 		.driver_data	= (unsigned long) &DAC960_LA_privdata,
3538 	},
3539 	{
3540 		PCI_DEVICE_DATA(MYLEX, DAC960_PG, &DAC960_PG_privdata),
3541 	},
3542 	{
3543 		PCI_DEVICE_DATA(MYLEX, DAC960_PD, &DAC960_PD_privdata),
3544 	},
3545 	{
3546 		PCI_DEVICE_DATA(MYLEX, DAC960_P, &DAC960_P_privdata),
3547 	},
3548 	{0, },
3549 };
3550 
3551 MODULE_DEVICE_TABLE(pci, myrb_id_table);
3552 
3553 static struct pci_driver myrb_pci_driver = {
3554 	.name		= "myrb",
3555 	.id_table	= myrb_id_table,
3556 	.probe		= myrb_probe,
3557 	.remove		= myrb_remove,
3558 };
3559 
3560 static int __init myrb_init_module(void)
3561 {
3562 	int ret;
3563 
3564 	myrb_raid_template = raid_class_attach(&myrb_raid_functions);
3565 	if (!myrb_raid_template)
3566 		return -ENODEV;
3567 
3568 	ret = pci_register_driver(&myrb_pci_driver);
3569 	if (ret)
3570 		raid_class_release(myrb_raid_template);
3571 
3572 	return ret;
3573 }
3574 
3575 static void __exit myrb_cleanup_module(void)
3576 {
3577 	pci_unregister_driver(&myrb_pci_driver);
3578 	raid_class_release(myrb_raid_template);
3579 }
3580 
3581 module_init(myrb_init_module);
3582 module_exit(myrb_cleanup_module);
3583 
3584 MODULE_DESCRIPTION("Mylex DAC960/AcceleRAID/eXtremeRAID driver (Block interface)");
3585 MODULE_AUTHOR("Hannes Reinecke <hare@suse.com>");
3586 MODULE_LICENSE("GPL");
3587