0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 #define SCSI_NCR_DRIVER_NAME "ncr53c8xx-3.4.3g"
0082
0083 #define SCSI_NCR_DEBUG_FLAGS (0)
0084
0085 #include <linux/blkdev.h>
0086 #include <linux/delay.h>
0087 #include <linux/dma-mapping.h>
0088 #include <linux/errno.h>
0089 #include <linux/gfp.h>
0090 #include <linux/init.h>
0091 #include <linux/interrupt.h>
0092 #include <linux/ioport.h>
0093 #include <linux/mm.h>
0094 #include <linux/module.h>
0095 #include <linux/sched.h>
0096 #include <linux/signal.h>
0097 #include <linux/spinlock.h>
0098 #include <linux/stat.h>
0099 #include <linux/string.h>
0100 #include <linux/time.h>
0101 #include <linux/timer.h>
0102 #include <linux/types.h>
0103
0104 #include <asm/dma.h>
0105 #include <asm/io.h>
0106
0107 #include <scsi/scsi.h>
0108 #include <scsi/scsi_cmnd.h>
0109 #include <scsi/scsi_dbg.h>
0110 #include <scsi/scsi_device.h>
0111 #include <scsi/scsi_tcq.h>
0112 #include <scsi/scsi_transport.h>
0113 #include <scsi/scsi_transport_spi.h>
0114
0115 #include "ncr53c8xx.h"
0116
0117 #define NAME53C8XX "ncr53c8xx"
0118
0119
0120
0121
0122
0123
0124
0125
0126 #define DEBUG_ALLOC (0x0001)
0127 #define DEBUG_PHASE (0x0002)
0128 #define DEBUG_QUEUE (0x0008)
0129 #define DEBUG_RESULT (0x0010)
0130 #define DEBUG_POINTER (0x0020)
0131 #define DEBUG_SCRIPT (0x0040)
0132 #define DEBUG_TINY (0x0080)
0133 #define DEBUG_TIMING (0x0100)
0134 #define DEBUG_NEGO (0x0200)
0135 #define DEBUG_TAGS (0x0400)
0136 #define DEBUG_SCATTER (0x0800)
0137 #define DEBUG_IC (0x1000)
0138
0139
0140
0141
0142
0143
0144 #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
0145 static int ncr_debug = SCSI_NCR_DEBUG_FLAGS;
0146 #define DEBUG_FLAGS ncr_debug
0147 #else
0148 #define DEBUG_FLAGS SCSI_NCR_DEBUG_FLAGS
0149 #endif
0150
0151
0152
0153
0154 #define SAM_STAT_ILLEGAL 0xff
0155
0156 static inline struct list_head *ncr_list_pop(struct list_head *head)
0157 {
0158 if (!list_empty(head)) {
0159 struct list_head *elem = head->next;
0160
0161 list_del(elem);
0162 return elem;
0163 }
0164
0165 return NULL;
0166 }
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186 #define MEMO_SHIFT 4
0187 #if PAGE_SIZE >= 8192
0188 #define MEMO_PAGE_ORDER 0
0189 #else
0190 #define MEMO_PAGE_ORDER 1
0191 #endif
0192 #define MEMO_FREE_UNUSED
0193 #define MEMO_WARN 1
0194 #define MEMO_GFP_FLAGS GFP_ATOMIC
0195 #define MEMO_CLUSTER_SHIFT (PAGE_SHIFT+MEMO_PAGE_ORDER)
0196 #define MEMO_CLUSTER_SIZE (1UL << MEMO_CLUSTER_SHIFT)
0197 #define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1)
0198
0199 typedef u_long m_addr_t;
0200 typedef struct device *m_bush_t;
0201
0202 typedef struct m_link {
0203 struct m_link *next;
0204 } m_link_s;
0205
0206 typedef struct m_vtob {
0207 struct m_vtob *next;
0208 m_addr_t vaddr;
0209 m_addr_t baddr;
0210 } m_vtob_s;
0211 #define VTOB_HASH_SHIFT 5
0212 #define VTOB_HASH_SIZE (1UL << VTOB_HASH_SHIFT)
0213 #define VTOB_HASH_MASK (VTOB_HASH_SIZE-1)
0214 #define VTOB_HASH_CODE(m) \
0215 ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK)
0216
0217 typedef struct m_pool {
0218 m_bush_t bush;
0219 m_addr_t (*getp)(struct m_pool *);
0220 void (*freep)(struct m_pool *, m_addr_t);
0221 int nump;
0222 m_vtob_s *(vtob[VTOB_HASH_SIZE]);
0223 struct m_pool *next;
0224 struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1];
0225 } m_pool_s;
0226
0227 static void *___m_alloc(m_pool_s *mp, int size)
0228 {
0229 int i = 0;
0230 int s = (1 << MEMO_SHIFT);
0231 int j;
0232 m_addr_t a;
0233 m_link_s *h = mp->h;
0234
0235 if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
0236 return NULL;
0237
0238 while (size > s) {
0239 s <<= 1;
0240 ++i;
0241 }
0242
0243 j = i;
0244 while (!h[j].next) {
0245 if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
0246 h[j].next = (m_link_s *)mp->getp(mp);
0247 if (h[j].next)
0248 h[j].next->next = NULL;
0249 break;
0250 }
0251 ++j;
0252 s <<= 1;
0253 }
0254 a = (m_addr_t) h[j].next;
0255 if (a) {
0256 h[j].next = h[j].next->next;
0257 while (j > i) {
0258 j -= 1;
0259 s >>= 1;
0260 h[j].next = (m_link_s *) (a+s);
0261 h[j].next->next = NULL;
0262 }
0263 }
0264 #ifdef DEBUG
0265 printk("___m_alloc(%d) = %p\n", size, (void *) a);
0266 #endif
0267 return (void *) a;
0268 }
0269
0270 static void ___m_free(m_pool_s *mp, void *ptr, int size)
0271 {
0272 int i = 0;
0273 int s = (1 << MEMO_SHIFT);
0274 m_link_s *q;
0275 m_addr_t a, b;
0276 m_link_s *h = mp->h;
0277
0278 #ifdef DEBUG
0279 printk("___m_free(%p, %d)\n", ptr, size);
0280 #endif
0281
0282 if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
0283 return;
0284
0285 while (size > s) {
0286 s <<= 1;
0287 ++i;
0288 }
0289
0290 a = (m_addr_t) ptr;
0291
0292 while (1) {
0293 #ifdef MEMO_FREE_UNUSED
0294 if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
0295 mp->freep(mp, a);
0296 break;
0297 }
0298 #endif
0299 b = a ^ s;
0300 q = &h[i];
0301 while (q->next && q->next != (m_link_s *) b) {
0302 q = q->next;
0303 }
0304 if (!q->next) {
0305 ((m_link_s *) a)->next = h[i].next;
0306 h[i].next = (m_link_s *) a;
0307 break;
0308 }
0309 q->next = q->next->next;
0310 a = a & b;
0311 s <<= 1;
0312 ++i;
0313 }
0314 }
0315
0316 static DEFINE_SPINLOCK(ncr53c8xx_lock);
0317
0318 static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags)
0319 {
0320 void *p;
0321
0322 p = ___m_alloc(mp, size);
0323
0324 if (DEBUG_FLAGS & DEBUG_ALLOC)
0325 printk ("new %-10s[%4d] @%p.\n", name, size, p);
0326
0327 if (p)
0328 memset(p, 0, size);
0329 else if (uflags & MEMO_WARN)
0330 printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size);
0331
0332 return p;
0333 }
0334
0335 #define __m_calloc(mp, s, n) __m_calloc2(mp, s, n, MEMO_WARN)
0336
0337 static void __m_free(m_pool_s *mp, void *ptr, int size, char *name)
0338 {
0339 if (DEBUG_FLAGS & DEBUG_ALLOC)
0340 printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr);
0341
0342 ___m_free(mp, ptr, size);
0343
0344 }
0345
0346
0347
0348
0349
0350
0351
0352 static m_addr_t ___mp0_getp(m_pool_s *mp)
0353 {
0354 m_addr_t m = __get_free_pages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER);
0355 if (m)
0356 ++mp->nump;
0357 return m;
0358 }
0359
0360 static void ___mp0_freep(m_pool_s *mp, m_addr_t m)
0361 {
0362 free_pages(m, MEMO_PAGE_ORDER);
0363 --mp->nump;
0364 }
0365
0366 static m_pool_s mp0 = {NULL, ___mp0_getp, ___mp0_freep};
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376 static m_addr_t ___dma_getp(m_pool_s *mp)
0377 {
0378 m_addr_t vp;
0379 m_vtob_s *vbp;
0380
0381 vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB");
0382 if (vbp) {
0383 dma_addr_t daddr;
0384 vp = (m_addr_t) dma_alloc_coherent(mp->bush,
0385 PAGE_SIZE<<MEMO_PAGE_ORDER,
0386 &daddr, GFP_ATOMIC);
0387 if (vp) {
0388 int hc = VTOB_HASH_CODE(vp);
0389 vbp->vaddr = vp;
0390 vbp->baddr = daddr;
0391 vbp->next = mp->vtob[hc];
0392 mp->vtob[hc] = vbp;
0393 ++mp->nump;
0394 return vp;
0395 }
0396 }
0397 if (vbp)
0398 __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
0399 return 0;
0400 }
0401
0402 static void ___dma_freep(m_pool_s *mp, m_addr_t m)
0403 {
0404 m_vtob_s **vbpp, *vbp;
0405 int hc = VTOB_HASH_CODE(m);
0406
0407 vbpp = &mp->vtob[hc];
0408 while (*vbpp && (*vbpp)->vaddr != m)
0409 vbpp = &(*vbpp)->next;
0410 if (*vbpp) {
0411 vbp = *vbpp;
0412 *vbpp = (*vbpp)->next;
0413 dma_free_coherent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER,
0414 (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
0415 __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
0416 --mp->nump;
0417 }
0418 }
0419
0420 static inline m_pool_s *___get_dma_pool(m_bush_t bush)
0421 {
0422 m_pool_s *mp;
0423 for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next);
0424 return mp;
0425 }
0426
0427 static m_pool_s *___cre_dma_pool(m_bush_t bush)
0428 {
0429 m_pool_s *mp;
0430 mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL");
0431 if (mp) {
0432 memset(mp, 0, sizeof(*mp));
0433 mp->bush = bush;
0434 mp->getp = ___dma_getp;
0435 mp->freep = ___dma_freep;
0436 mp->next = mp0.next;
0437 mp0.next = mp;
0438 }
0439 return mp;
0440 }
0441
0442 static void ___del_dma_pool(m_pool_s *p)
0443 {
0444 struct m_pool **pp = &mp0.next;
0445
0446 while (*pp && *pp != p)
0447 pp = &(*pp)->next;
0448 if (*pp) {
0449 *pp = (*pp)->next;
0450 __m_free(&mp0, p, sizeof(*p), "MPOOL");
0451 }
0452 }
0453
0454 static void *__m_calloc_dma(m_bush_t bush, int size, char *name)
0455 {
0456 u_long flags;
0457 struct m_pool *mp;
0458 void *m = NULL;
0459
0460 spin_lock_irqsave(&ncr53c8xx_lock, flags);
0461 mp = ___get_dma_pool(bush);
0462 if (!mp)
0463 mp = ___cre_dma_pool(bush);
0464 if (mp)
0465 m = __m_calloc(mp, size, name);
0466 if (mp && !mp->nump)
0467 ___del_dma_pool(mp);
0468 spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
0469
0470 return m;
0471 }
0472
0473 static void __m_free_dma(m_bush_t bush, void *m, int size, char *name)
0474 {
0475 u_long flags;
0476 struct m_pool *mp;
0477
0478 spin_lock_irqsave(&ncr53c8xx_lock, flags);
0479 mp = ___get_dma_pool(bush);
0480 if (mp)
0481 __m_free(mp, m, size, name);
0482 if (mp && !mp->nump)
0483 ___del_dma_pool(mp);
0484 spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
0485 }
0486
0487 static m_addr_t __vtobus(m_bush_t bush, void *m)
0488 {
0489 u_long flags;
0490 m_pool_s *mp;
0491 int hc = VTOB_HASH_CODE(m);
0492 m_vtob_s *vp = NULL;
0493 m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK;
0494
0495 spin_lock_irqsave(&ncr53c8xx_lock, flags);
0496 mp = ___get_dma_pool(bush);
0497 if (mp) {
0498 vp = mp->vtob[hc];
0499 while (vp && (m_addr_t) vp->vaddr != a)
0500 vp = vp->next;
0501 }
0502 spin_unlock_irqrestore(&ncr53c8xx_lock, flags);
0503 return vp ? vp->baddr + (((m_addr_t) m) - a) : 0;
0504 }
0505
0506 #define _m_calloc_dma(np, s, n) __m_calloc_dma(np->dev, s, n)
0507 #define _m_free_dma(np, p, s, n) __m_free_dma(np->dev, p, s, n)
0508 #define m_calloc_dma(s, n) _m_calloc_dma(np, s, n)
0509 #define m_free_dma(p, s, n) _m_free_dma(np, p, s, n)
0510 #define _vtobus(np, p) __vtobus(np->dev, p)
0511 #define vtobus(p) _vtobus(np, p)
0512
0513
0514
0515
0516
0517 static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd)
0518 {
0519 struct ncr_cmd_priv *cmd_priv = scsi_cmd_priv(cmd);
0520
0521 switch(cmd_priv->data_mapped) {
0522 case 2:
0523 scsi_dma_unmap(cmd);
0524 break;
0525 }
0526 cmd_priv->data_mapped = 0;
0527 }
0528
0529 static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd)
0530 {
0531 struct ncr_cmd_priv *cmd_priv = scsi_cmd_priv(cmd);
0532 int use_sg;
0533
0534 use_sg = scsi_dma_map(cmd);
0535 if (!use_sg)
0536 return 0;
0537
0538 cmd_priv->data_mapped = 2;
0539 cmd_priv->data_mapping = use_sg;
0540
0541 return use_sg;
0542 }
0543
0544 #define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->dev, cmd)
0545 #define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->dev, cmd)
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557 static struct ncr_driver_setup
0558 driver_setup = SCSI_NCR_DRIVER_SETUP;
0559
0560 #ifndef MODULE
0561 #ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
0562 static struct ncr_driver_setup
0563 driver_safe_setup __initdata = SCSI_NCR_DRIVER_SAFE_SETUP;
0564 #endif
0565 #endif
0566
0567 #define initverbose (driver_setup.verbose)
0568 #define bootverbose (np->verbose)
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578 #ifdef MODULE
0579 #define ARG_SEP ' '
0580 #else
0581 #define ARG_SEP ','
0582 #endif
0583
0584 #define OPT_TAGS 1
0585 #define OPT_MASTER_PARITY 2
0586 #define OPT_SCSI_PARITY 3
0587 #define OPT_DISCONNECTION 4
0588 #define OPT_SPECIAL_FEATURES 5
0589 #define OPT_UNUSED_1 6
0590 #define OPT_FORCE_SYNC_NEGO 7
0591 #define OPT_REVERSE_PROBE 8
0592 #define OPT_DEFAULT_SYNC 9
0593 #define OPT_VERBOSE 10
0594 #define OPT_DEBUG 11
0595 #define OPT_BURST_MAX 12
0596 #define OPT_LED_PIN 13
0597 #define OPT_MAX_WIDE 14
0598 #define OPT_SETTLE_DELAY 15
0599 #define OPT_DIFF_SUPPORT 16
0600 #define OPT_IRQM 17
0601 #define OPT_PCI_FIX_UP 18
0602 #define OPT_BUS_CHECK 19
0603 #define OPT_OPTIMIZE 20
0604 #define OPT_RECOVERY 21
0605 #define OPT_SAFE_SETUP 22
0606 #define OPT_USE_NVRAM 23
0607 #define OPT_EXCLUDE 24
0608 #define OPT_HOST_ID 25
0609
0610 #ifdef SCSI_NCR_IARB_SUPPORT
0611 #define OPT_IARB 26
0612 #endif
0613
0614 #ifdef MODULE
0615 #define ARG_SEP ' '
0616 #else
0617 #define ARG_SEP ','
0618 #endif
0619
0620 #ifndef MODULE
0621 static char setup_token[] __initdata =
0622 "tags:" "mpar:"
0623 "spar:" "disc:"
0624 "specf:" "ultra:"
0625 "fsn:" "revprob:"
0626 "sync:" "verb:"
0627 "debug:" "burst:"
0628 "led:" "wide:"
0629 "settle:" "diff:"
0630 "irqm:" "pcifix:"
0631 "buschk:" "optim:"
0632 "recovery:"
0633 "safe:" "nvram:"
0634 "excl:" "hostid:"
0635 #ifdef SCSI_NCR_IARB_SUPPORT
0636 "iarb:"
0637 #endif
0638 ;
0639
0640 static int __init get_setup_token(char *p)
0641 {
0642 char *cur = setup_token;
0643 char *pc;
0644 int i = 0;
0645
0646 while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
0647 ++pc;
0648 ++i;
0649 if (!strncmp(p, cur, pc - cur))
0650 return i;
0651 cur = pc;
0652 }
0653 return 0;
0654 }
0655
0656 static int __init sym53c8xx__setup(char *str)
0657 {
0658 #ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
0659 char *cur = str;
0660 char *pc, *pv;
0661 int i, val, c;
0662 int xi = 0;
0663
0664 while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
0665 char *pe;
0666
0667 val = 0;
0668 pv = pc;
0669 c = *++pv;
0670
0671 if (c == 'n')
0672 val = 0;
0673 else if (c == 'y')
0674 val = 1;
0675 else
0676 val = (int) simple_strtoul(pv, &pe, 0);
0677
0678 switch (get_setup_token(cur)) {
0679 case OPT_TAGS:
0680 driver_setup.default_tags = val;
0681 if (pe && *pe == '/') {
0682 i = 0;
0683 while (*pe && *pe != ARG_SEP &&
0684 i < sizeof(driver_setup.tag_ctrl)-1) {
0685 driver_setup.tag_ctrl[i++] = *pe++;
0686 }
0687 driver_setup.tag_ctrl[i] = '\0';
0688 }
0689 break;
0690 case OPT_MASTER_PARITY:
0691 driver_setup.master_parity = val;
0692 break;
0693 case OPT_SCSI_PARITY:
0694 driver_setup.scsi_parity = val;
0695 break;
0696 case OPT_DISCONNECTION:
0697 driver_setup.disconnection = val;
0698 break;
0699 case OPT_SPECIAL_FEATURES:
0700 driver_setup.special_features = val;
0701 break;
0702 case OPT_FORCE_SYNC_NEGO:
0703 driver_setup.force_sync_nego = val;
0704 break;
0705 case OPT_REVERSE_PROBE:
0706 driver_setup.reverse_probe = val;
0707 break;
0708 case OPT_DEFAULT_SYNC:
0709 driver_setup.default_sync = val;
0710 break;
0711 case OPT_VERBOSE:
0712 driver_setup.verbose = val;
0713 break;
0714 case OPT_DEBUG:
0715 driver_setup.debug = val;
0716 break;
0717 case OPT_BURST_MAX:
0718 driver_setup.burst_max = val;
0719 break;
0720 case OPT_LED_PIN:
0721 driver_setup.led_pin = val;
0722 break;
0723 case OPT_MAX_WIDE:
0724 driver_setup.max_wide = val? 1:0;
0725 break;
0726 case OPT_SETTLE_DELAY:
0727 driver_setup.settle_delay = val;
0728 break;
0729 case OPT_DIFF_SUPPORT:
0730 driver_setup.diff_support = val;
0731 break;
0732 case OPT_IRQM:
0733 driver_setup.irqm = val;
0734 break;
0735 case OPT_PCI_FIX_UP:
0736 driver_setup.pci_fix_up = val;
0737 break;
0738 case OPT_BUS_CHECK:
0739 driver_setup.bus_check = val;
0740 break;
0741 case OPT_OPTIMIZE:
0742 driver_setup.optimize = val;
0743 break;
0744 case OPT_RECOVERY:
0745 driver_setup.recovery = val;
0746 break;
0747 case OPT_USE_NVRAM:
0748 driver_setup.use_nvram = val;
0749 break;
0750 case OPT_SAFE_SETUP:
0751 memcpy(&driver_setup, &driver_safe_setup,
0752 sizeof(driver_setup));
0753 break;
0754 case OPT_EXCLUDE:
0755 if (xi < SCSI_NCR_MAX_EXCLUDES)
0756 driver_setup.excludes[xi++] = val;
0757 break;
0758 case OPT_HOST_ID:
0759 driver_setup.host_id = val;
0760 break;
0761 #ifdef SCSI_NCR_IARB_SUPPORT
0762 case OPT_IARB:
0763 driver_setup.iarb = val;
0764 break;
0765 #endif
0766 default:
0767 printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
0768 break;
0769 }
0770
0771 if ((cur = strchr(cur, ARG_SEP)) != NULL)
0772 ++cur;
0773 }
0774 #endif
0775 return 1;
0776 }
0777 #endif
0778
0779
0780
0781
0782
0783
0784
0785 #define DEF_DEPTH (driver_setup.default_tags)
0786 #define ALL_TARGETS -2
0787 #define NO_TARGET -1
0788 #define ALL_LUNS -2
0789 #define NO_LUN -1
0790
0791 static int device_queue_depth(int unit, int target, int lun)
0792 {
0793 int c, h, t, u, v;
0794 char *p = driver_setup.tag_ctrl;
0795 char *ep;
0796
0797 h = -1;
0798 t = NO_TARGET;
0799 u = NO_LUN;
0800 while ((c = *p++) != 0) {
0801 v = simple_strtoul(p, &ep, 0);
0802 switch(c) {
0803 case '/':
0804 ++h;
0805 t = ALL_TARGETS;
0806 u = ALL_LUNS;
0807 break;
0808 case 't':
0809 if (t != target)
0810 t = (target == v) ? v : NO_TARGET;
0811 u = ALL_LUNS;
0812 break;
0813 case 'u':
0814 if (u != lun)
0815 u = (lun == v) ? v : NO_LUN;
0816 break;
0817 case 'q':
0818 if (h == unit &&
0819 (t == ALL_TARGETS || t == target) &&
0820 (u == ALL_LUNS || u == lun))
0821 return v;
0822 break;
0823 case '-':
0824 t = ALL_TARGETS;
0825 u = ALL_LUNS;
0826 break;
0827 default:
0828 break;
0829 }
0830 p = ep;
0831 }
0832 return DEF_DEPTH;
0833 }
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853 #define SCSI_NCR_CCB_DONE_SUPPORT
0854 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
0855
0856 #define MAX_DONE 24
0857 #define CCB_DONE_EMPTY 0xffffffffUL
0858
0859
0860 #if BITS_PER_LONG == 32
0861 #define CCB_DONE_VALID(cp) (((u_long) cp) != CCB_DONE_EMPTY)
0862
0863
0864 #else
0865 #define CCB_DONE_VALID(cp) \
0866 ((((u_long) cp) & 0xffffffff00000000ul) && \
0867 (((u_long) cp) & 0xfffffffful) != CCB_DONE_EMPTY)
0868 #endif
0869
0870 #endif
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885 #ifndef SCSI_NCR_MYADDR
0886 #define SCSI_NCR_MYADDR (7)
0887 #endif
0888
0889
0890
0891
0892
0893
0894 #ifndef SCSI_NCR_MAX_TAGS
0895 #define SCSI_NCR_MAX_TAGS (8)
0896 #endif
0897
0898
0899
0900
0901
0902 #if SCSI_NCR_MAX_TAGS > 64
0903 #define MAX_TAGS (64)
0904 #else
0905 #define MAX_TAGS SCSI_NCR_MAX_TAGS
0906 #endif
0907
0908 #define NO_TAG (255)
0909
0910
0911
0912
0913 #if MAX_TAGS > 32
0914 typedef u64 tagmap_t;
0915 #else
0916 typedef u32 tagmap_t;
0917 #endif
0918
0919
0920
0921
0922
0923
0924
0925
0926 #ifdef SCSI_NCR_MAX_TARGET
0927 #define MAX_TARGET (SCSI_NCR_MAX_TARGET)
0928 #else
0929 #define MAX_TARGET (16)
0930 #endif
0931
0932
0933
0934
0935
0936
0937
0938
0939 #ifdef SCSI_NCR_MAX_LUN
0940 #define MAX_LUN SCSI_NCR_MAX_LUN
0941 #else
0942 #define MAX_LUN (1)
0943 #endif
0944
0945
0946
0947
0948
0949 #ifndef SCSI_NCR_MIN_ASYNC
0950 #define SCSI_NCR_MIN_ASYNC (40)
0951 #endif
0952
0953
0954
0955
0956
0957
0958
0959
0960 #ifdef SCSI_NCR_CAN_QUEUE
0961 #define MAX_START (SCSI_NCR_CAN_QUEUE + 4)
0962 #else
0963 #define MAX_START (MAX_TARGET + 7 * MAX_TAGS)
0964 #endif
0965
0966
0967
0968
0969
0970
0971 #if MAX_START > 250
0972 #undef MAX_START
0973 #define MAX_START 250
0974 #endif
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985 #define MAX_SCATTER (SCSI_NCR_MAX_SCATTER)
0986
0987 #if (MAX_SCATTER > 80)
0988 #define MAX_SCATTERL 80
0989 #define MAX_SCATTERH (MAX_SCATTER - MAX_SCATTERL)
0990 #else
0991 #define MAX_SCATTERL (MAX_SCATTER-1)
0992 #define MAX_SCATTERH 1
0993 #endif
0994
0995
0996
0997
0998
0999 #define NCR_SNOOP_TIMEOUT (1000000)
1000
1001
1002
1003
1004
1005 #define initverbose (driver_setup.verbose)
1006 #define bootverbose (np->verbose)
1007
1008
1009
1010
1011
1012
1013
1014
1015 #define HS_IDLE (0)
1016 #define HS_BUSY (1)
1017 #define HS_NEGOTIATE (2)
1018 #define HS_DISCONNECT (3)
1019
1020 #define HS_DONEMASK (0x80)
1021 #define HS_COMPLETE (4|HS_DONEMASK)
1022 #define HS_SEL_TIMEOUT (5|HS_DONEMASK)
1023 #define HS_RESET (6|HS_DONEMASK)
1024 #define HS_ABORTED (7|HS_DONEMASK)
1025 #define HS_TIMEOUT (8|HS_DONEMASK)
1026 #define HS_FAIL (9|HS_DONEMASK)
1027 #define HS_UNEXPECTED (10|HS_DONEMASK)
1028
1029
1030
1031
1032
1033
1034
1035 #define HS_INVALMASK (0x40)
1036 #define HS_SELECTING (0|HS_INVALMASK)
1037 #define HS_IN_RESELECT (1|HS_INVALMASK)
1038 #define HS_STARTING (2|HS_INVALMASK)
1039
1040
1041
1042
1043
1044 #define HS_SKIPMASK (0x20)
1045
1046
1047
1048
1049
1050
1051
1052
1053 #define SIR_BAD_STATUS (1)
1054 #define SIR_XXXXXXXXXX (2)
1055 #define SIR_NEGO_SYNC (3)
1056 #define SIR_NEGO_WIDE (4)
1057 #define SIR_NEGO_FAILED (5)
1058 #define SIR_NEGO_PROTO (6)
1059 #define SIR_REJECT_RECEIVED (7)
1060 #define SIR_REJECT_SENT (8)
1061 #define SIR_IGN_RESIDUE (9)
1062 #define SIR_MISSING_SAVE (10)
1063 #define SIR_RESEL_NO_MSG_IN (11)
1064 #define SIR_RESEL_NO_IDENTIFY (12)
1065 #define SIR_RESEL_BAD_LUN (13)
1066 #define SIR_RESEL_BAD_TARGET (14)
1067 #define SIR_RESEL_BAD_I_T_L (15)
1068 #define SIR_RESEL_BAD_I_T_L_Q (16)
1069 #define SIR_DONE_OVERFLOW (17)
1070 #define SIR_INTFLY (18)
1071 #define SIR_MAX (18)
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081 #define XE_OK (0)
1082 #define XE_EXTRA_DATA (1)
1083 #define XE_BAD_PHASE (2)
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093 #define NS_NOCHANGE (0)
1094 #define NS_SYNC (1)
1095 #define NS_WIDE (2)
1096 #define NS_PPR (4)
1097
1098
1099
1100
1101
1102
1103
1104
1105 #define CCB_MAGIC (0xf2691ad2)
1106
1107
1108
1109
1110
1111
1112
1113
1114 static struct scsi_transport_template *ncr53c8xx_transport_template = NULL;
1115
1116 struct tcb;
1117 struct lcb;
1118 struct ccb;
1119 struct ncb;
1120 struct script;
1121
1122 struct link {
1123 ncrcmd l_cmd;
1124 ncrcmd l_paddr;
1125 };
1126
1127 struct usrcmd {
1128 u_long target;
1129 u_long lun;
1130 u_long data;
1131 u_long cmd;
1132 };
1133
1134 #define UC_SETSYNC 10
1135 #define UC_SETTAGS 11
1136 #define UC_SETDEBUG 12
1137 #define UC_SETORDER 13
1138 #define UC_SETWIDE 14
1139 #define UC_SETFLAG 15
1140 #define UC_SETVERBOSE 17
1141
1142 #define UF_TRACE (0x01)
1143 #define UF_NODISC (0x02)
1144 #define UF_NOSCAN (0x04)
1145
1146
1147
1148
1149
1150
1151
1152 struct tcb {
1153
1154
1155
1156
1157
1158
1159
1160
1161 struct link jump_tcb;
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 ncrcmd getscr[6];
1172
1173
1174
1175
1176
1177
1178
1179 struct link call_lun;
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191 struct link jump_lcb[4];
1192 struct lcb * lp[MAX_LUN];
1193
1194
1195
1196
1197
1198
1199
1200 struct ccb * nego_cp;
1201
1202
1203
1204
1205
1206 u_long transfers;
1207 u_long bytes;
1208
1209
1210
1211
1212
1213 #ifdef SCSI_NCR_BIG_ENDIAN
1214 u16 period;
1215 u_char sval;
1216 u_char minsync;
1217 u_char wval;
1218 u_char widedone;
1219 u_char quirks;
1220 u_char maxoffs;
1221 #else
1222 u_char minsync;
1223 u_char sval;
1224 u16 period;
1225 u_char maxoffs;
1226 u_char quirks;
1227 u_char widedone;
1228 u_char wval;
1229 #endif
1230
1231
1232 u_char usrsync;
1233 u_char usrwide;
1234 u_char usrtags;
1235 u_char usrflag;
1236 struct scsi_target *starget;
1237 };
1238
1239
1240
1241
1242
1243
1244
1245 struct lcb {
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260 struct link jump_lcb;
1261 ncrcmd load_jump_ccb[3];
1262 struct link jump_tag;
1263 ncrcmd p_jump_ccb;
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273 u32 jump_ccb_0;
1274 u32 *jump_ccb;
1275
1276
1277
1278
1279
1280 struct list_head free_ccbq;
1281 struct list_head busy_ccbq;
1282 struct list_head wait_ccbq;
1283 struct list_head skip_ccbq;
1284 u_char actccbs;
1285 u_char busyccbs;
1286 u_char queuedccbs;
1287 u_char queuedepth;
1288 u_char scdev_depth;
1289 u_char maxnxs;
1290
1291
1292
1293
1294
1295
1296
1297 u_char ia_tag;
1298 u_char if_tag;
1299 u_char cb_tags[MAX_TAGS];
1300 u_char usetags;
1301 u_char maxtags;
1302 u_char numtags;
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312 u16 num_good;
1313 tagmap_t tags_umap;
1314 tagmap_t tags_smap;
1315 u_long tags_stime;
1316 struct ccb * held_ccb;
1317 };
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331 struct launch {
1332
1333
1334
1335
1336
1337 ncrcmd setup_dsa[3];
1338 struct link schedule;
1339 ncrcmd p_phys;
1340 };
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356 struct head {
1357
1358
1359
1360
1361
1362
1363
1364
1365 u32 savep;
1366 u32 lastp;
1367 u32 goalp;
1368
1369
1370
1371
1372
1373
1374
1375 u32 wlastp;
1376 u32 wgoalp;
1377
1378
1379
1380
1381
1382 struct ccb * cp;
1383
1384
1385
1386
1387
1388 u_char scr_st[4];
1389 u_char status[4];
1390
1391 };
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419 #define QU_REG scr0
1420 #define HS_REG scr1
1421 #define HS_PRT nc_scr1
1422 #define SS_REG scr2
1423 #define SS_PRT nc_scr2
1424 #define PS_REG scr3
1425
1426
1427
1428
1429 #ifdef SCSI_NCR_BIG_ENDIAN
1430 #define actualquirks phys.header.status[3]
1431 #define host_status phys.header.status[2]
1432 #define scsi_status phys.header.status[1]
1433 #define parity_status phys.header.status[0]
1434 #else
1435 #define actualquirks phys.header.status[0]
1436 #define host_status phys.header.status[1]
1437 #define scsi_status phys.header.status[2]
1438 #define parity_status phys.header.status[3]
1439 #endif
1440
1441
1442
1443
1444 #define xerr_st header.scr_st[0]
1445 #define sync_st header.scr_st[1]
1446 #define nego_st header.scr_st[2]
1447 #define wide_st header.scr_st[3]
1448
1449
1450
1451
1452 #define xerr_status phys.xerr_st
1453 #define nego_status phys.nego_st
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471 struct dsb {
1472
1473
1474
1475
1476
1477 struct head header;
1478
1479
1480
1481
1482
1483 struct scr_tblsel select;
1484 struct scr_tblmove smsg ;
1485 struct scr_tblmove cmd ;
1486 struct scr_tblmove sense ;
1487 struct scr_tblmove data[MAX_SCATTER];
1488 };
1489
1490
1491
1492
1493
1494
1495
1496
1497 struct ccb {
1498
1499
1500
1501
1502
1503
1504
1505 struct dsb phys;
1506
1507
1508
1509
1510
1511
1512
1513 struct launch start;
1514
1515
1516
1517
1518
1519
1520
1521 struct launch restart;
1522
1523
1524
1525
1526
1527
1528
1529
1530 ncrcmd patch[8];
1531
1532
1533
1534
1535
1536
1537 struct scsi_cmnd *cmd;
1538 u_char cdb_buf[16];
1539 u_char sense_buf[64];
1540 int data_len;
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552 u_char scsi_smsg [8];
1553 u_char scsi_smsg2[8];
1554
1555
1556
1557
1558
1559 u_long p_ccb;
1560 u_char sensecmd[6];
1561 u_char tag;
1562
1563 u_char target;
1564 u_char lun;
1565 u_char queued;
1566 u_char auto_sense;
1567 struct ccb * link_ccb;
1568 struct list_head link_ccbq;
1569 u32 startp;
1570 u_long magic;
1571 };
1572
1573 #define CCB_PHYS(cp,lbl) (cp->p_ccb + offsetof(struct ccb, lbl))
1574
1575
1576
1577
1578
1579
1580
1581
1582 struct ncb {
1583
1584
1585
1586
1587
1588
1589
1590 struct head header;
1591
1592
1593
1594
1595
1596 struct scsi_cmnd *waiting_list;
1597
1598 struct scsi_cmnd *done_list;
1599
1600 spinlock_t smp_lock;
1601
1602
1603
1604
1605
1606 int unit;
1607 char inst_name[16];
1608
1609
1610
1611
1612
1613
1614
1615 u_char sv_scntl0, sv_scntl3, sv_dmode, sv_dcntl, sv_ctest0, sv_ctest3,
1616 sv_ctest4, sv_ctest5, sv_gpcntl, sv_stest2, sv_stest4;
1617
1618
1619
1620
1621
1622
1623
1624 u_char rv_scntl0, rv_scntl3, rv_dmode, rv_dcntl, rv_ctest0, rv_ctest3,
1625 rv_ctest4, rv_ctest5, rv_stest2;
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638 struct link jump_tcb[4];
1639 struct tcb target[MAX_TARGET];
1640
1641
1642
1643
1644
1645 void __iomem *vaddr;
1646 unsigned long paddr;
1647 unsigned long paddr2;
1648 volatile
1649 struct ncr_reg __iomem *reg;
1650
1651
1652
1653
1654
1655
1656
1657 struct script *script0;
1658 struct scripth *scripth0;
1659 struct scripth *scripth;
1660 u_long p_script;
1661 u_long p_scripth;
1662
1663
1664
1665
1666
1667 struct device *dev;
1668 u_char revision_id;
1669 u32 irq;
1670 u32 features;
1671 u_char myaddr;
1672 u_char maxburst;
1673 u_char maxwide;
1674 u_char minsync;
1675 u_char maxsync;
1676 u_char maxoffs;
1677 u_char multiplier;
1678 u_char clock_divn;
1679 u_long clock_khz;
1680
1681
1682
1683
1684
1685
1686
1687 u16 squeueput;
1688 u16 actccbs;
1689 u16 queuedccbs;
1690 u16 queuedepth;
1691
1692
1693
1694
1695
1696 struct timer_list timer;
1697 u_long lasttime;
1698 u_long settle_time;
1699
1700
1701
1702
1703
1704 struct ncr_reg regdump;
1705 u_long regtime;
1706
1707
1708
1709
1710
1711
1712
1713 u_char msgout[8];
1714 u_char msgin [8];
1715 u32 lastmsg;
1716 u_char scratch;
1717
1718
1719
1720
1721
1722 u_char disc;
1723 u_char scsi_mode;
1724 u_char order;
1725 u_char verbose;
1726 int ncr_cache;
1727 u_long p_ncb;
1728
1729
1730
1731
1732
1733 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
1734 struct ccb *(ccb_done[MAX_DONE]);
1735 int ccb_done_ic;
1736 #endif
1737
1738
1739
1740
1741 struct ccb *ccb;
1742 struct usrcmd user;
1743 volatile u_char release_stage;
1744 };
1745
1746 #define NCB_SCRIPT_PHYS(np,lbl) (np->p_script + offsetof (struct script, lbl))
1747 #define NCB_SCRIPTH_PHYS(np,lbl) (np->p_scripth + offsetof (struct scripth,lbl))
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779 #ifdef CONFIG_NCR53C8XX_PREFETCH
1780 #define PREFETCH_FLUSH_CNT 2
1781 #define PREFETCH_FLUSH SCR_CALL, PADDRH (wait_dma),
1782 #else
1783 #define PREFETCH_FLUSH_CNT 0
1784 #define PREFETCH_FLUSH
1785 #endif
1786
1787
1788
1789
1790
1791 struct script {
1792 ncrcmd start [ 5];
1793 ncrcmd startpos [ 1];
1794 ncrcmd select [ 6];
1795 ncrcmd select2 [ 9 + PREFETCH_FLUSH_CNT];
1796 ncrcmd loadpos [ 4];
1797 ncrcmd send_ident [ 9];
1798 ncrcmd prepare [ 6];
1799 ncrcmd prepare2 [ 7];
1800 ncrcmd command [ 6];
1801 ncrcmd dispatch [ 32];
1802 ncrcmd clrack [ 4];
1803 ncrcmd no_data [ 17];
1804 ncrcmd status [ 8];
1805 ncrcmd msg_in [ 2];
1806 ncrcmd msg_in2 [ 16];
1807 ncrcmd msg_bad [ 4];
1808 ncrcmd setmsg [ 7];
1809 ncrcmd cleanup [ 6];
1810 ncrcmd complete [ 9];
1811 ncrcmd cleanup_ok [ 8 + PREFETCH_FLUSH_CNT];
1812 ncrcmd cleanup0 [ 1];
1813 #ifndef SCSI_NCR_CCB_DONE_SUPPORT
1814 ncrcmd signal [ 12];
1815 #else
1816 ncrcmd signal [ 9];
1817 ncrcmd done_pos [ 1];
1818 ncrcmd done_plug [ 2];
1819 ncrcmd done_end [ 7];
1820 #endif
1821 ncrcmd save_dp [ 7];
1822 ncrcmd restore_dp [ 5];
1823 ncrcmd disconnect [ 10];
1824 ncrcmd msg_out [ 9];
1825 ncrcmd msg_out_done [ 7];
1826 ncrcmd idle [ 2];
1827 ncrcmd reselect [ 8];
1828 ncrcmd reselected [ 8];
1829 ncrcmd resel_dsa [ 6 + PREFETCH_FLUSH_CNT];
1830 ncrcmd loadpos1 [ 4];
1831 ncrcmd resel_lun [ 6];
1832 ncrcmd resel_tag [ 6];
1833 ncrcmd jump_to_nexus [ 4 + PREFETCH_FLUSH_CNT];
1834 ncrcmd nexus_indirect [ 4];
1835 ncrcmd resel_notag [ 4];
1836 ncrcmd data_in [MAX_SCATTERL * 4];
1837 ncrcmd data_in2 [ 4];
1838 ncrcmd data_out [MAX_SCATTERL * 4];
1839 ncrcmd data_out2 [ 4];
1840 };
1841
1842
1843
1844
1845 struct scripth {
1846 ncrcmd tryloop [MAX_START*2];
1847 ncrcmd tryloop2 [ 2];
1848 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
1849 ncrcmd done_queue [MAX_DONE*5];
1850 ncrcmd done_queue2 [ 2];
1851 #endif
1852 ncrcmd select_no_atn [ 8];
1853 ncrcmd cancel [ 4];
1854 ncrcmd skip [ 9 + PREFETCH_FLUSH_CNT];
1855 ncrcmd skip2 [ 19];
1856 ncrcmd par_err_data_in [ 6];
1857 ncrcmd par_err_other [ 4];
1858 ncrcmd msg_reject [ 8];
1859 ncrcmd msg_ign_residue [ 24];
1860 ncrcmd msg_extended [ 10];
1861 ncrcmd msg_ext_2 [ 10];
1862 ncrcmd msg_wdtr [ 14];
1863 ncrcmd send_wdtr [ 7];
1864 ncrcmd msg_ext_3 [ 10];
1865 ncrcmd msg_sdtr [ 14];
1866 ncrcmd send_sdtr [ 7];
1867 ncrcmd nego_bad_phase [ 4];
1868 ncrcmd msg_out_abort [ 10];
1869 ncrcmd hdata_in [MAX_SCATTERH * 4];
1870 ncrcmd hdata_in2 [ 2];
1871 ncrcmd hdata_out [MAX_SCATTERH * 4];
1872 ncrcmd hdata_out2 [ 2];
1873 ncrcmd reset [ 4];
1874 ncrcmd aborttag [ 4];
1875 ncrcmd abort [ 2];
1876 ncrcmd abort_resel [ 20];
1877 ncrcmd resend_ident [ 4];
1878 ncrcmd clratn_go_on [ 3];
1879 ncrcmd nxtdsp_go_on [ 1];
1880 ncrcmd sdata_in [ 8];
1881 ncrcmd data_io [ 18];
1882 ncrcmd bad_identify [ 12];
1883 ncrcmd bad_i_t_l [ 4];
1884 ncrcmd bad_i_t_l_q [ 4];
1885 ncrcmd bad_target [ 8];
1886 ncrcmd bad_status [ 8];
1887 ncrcmd start_ram [ 4 + PREFETCH_FLUSH_CNT];
1888 ncrcmd start_ram0 [ 4];
1889 ncrcmd sto_restart [ 5];
1890 ncrcmd wait_dma [ 2];
1891 ncrcmd snooptest [ 9];
1892 ncrcmd snoopend [ 2];
1893 };
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904 static void ncr_alloc_ccb (struct ncb *np, u_char tn, u_char ln);
1905 static void ncr_complete (struct ncb *np, struct ccb *cp);
1906 static void ncr_exception (struct ncb *np);
1907 static void ncr_free_ccb (struct ncb *np, struct ccb *cp);
1908 static void ncr_init_ccb (struct ncb *np, struct ccb *cp);
1909 static void ncr_init_tcb (struct ncb *np, u_char tn);
1910 static struct lcb * ncr_alloc_lcb (struct ncb *np, u_char tn, u_char ln);
1911 static struct lcb * ncr_setup_lcb (struct ncb *np, struct scsi_device *sdev);
1912 static void ncr_getclock (struct ncb *np, int mult);
1913 static void ncr_selectclock (struct ncb *np, u_char scntl3);
1914 static struct ccb *ncr_get_ccb (struct ncb *np, struct scsi_cmnd *cmd);
1915 static void ncr_chip_reset (struct ncb *np, int delay);
1916 static void ncr_init (struct ncb *np, int reset, char * msg, u_long code);
1917 static int ncr_int_sbmc (struct ncb *np);
1918 static int ncr_int_par (struct ncb *np);
1919 static void ncr_int_ma (struct ncb *np);
1920 static void ncr_int_sir (struct ncb *np);
1921 static void ncr_int_sto (struct ncb *np);
1922 static void ncr_negotiate (struct ncb* np, struct tcb* tp);
1923 static int ncr_prepare_nego(struct ncb *np, struct ccb *cp, u_char *msgptr);
1924
1925 static void ncr_script_copy_and_bind
1926 (struct ncb *np, ncrcmd *src, ncrcmd *dst, int len);
1927 static void ncr_script_fill (struct script * scr, struct scripth * scripth);
1928 static int ncr_scatter (struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd);
1929 static void ncr_getsync (struct ncb *np, u_char sfac, u_char *fakp, u_char *scntl3p);
1930 static void ncr_setsync (struct ncb *np, struct ccb *cp, u_char scntl3, u_char sxfer);
1931 static void ncr_setup_tags (struct ncb *np, struct scsi_device *sdev);
1932 static void ncr_setwide (struct ncb *np, struct ccb *cp, u_char wide, u_char ack);
1933 static int ncr_snooptest (struct ncb *np);
1934 static void ncr_timeout (struct ncb *np);
1935 static void ncr_wakeup (struct ncb *np, u_long code);
1936 static void ncr_wakeup_done (struct ncb *np);
1937 static void ncr_start_next_ccb (struct ncb *np, struct lcb * lp, int maxn);
1938 static void ncr_put_start_queue(struct ncb *np, struct ccb *cp);
1939
1940 static void insert_into_waiting_list(struct ncb *np, struct scsi_cmnd *cmd);
1941 static void process_waiting_list(struct ncb *np, int sts);
1942
1943 #define requeue_waiting_list(np) process_waiting_list((np), DID_OK)
1944 #define reset_waiting_list(np) process_waiting_list((np), DID_RESET)
1945
1946 static inline char *ncr_name (struct ncb *np)
1947 {
1948 return np->inst_name;
1949 }
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971 #define RELOC_SOFTC 0x40000000
1972 #define RELOC_LABEL 0x50000000
1973 #define RELOC_REGISTER 0x60000000
1974 #define RELOC_LABELH 0x80000000
1975 #define RELOC_MASK 0xf0000000
1976
1977 #define NADDR(label) (RELOC_SOFTC | offsetof(struct ncb, label))
1978 #define PADDR(label) (RELOC_LABEL | offsetof(struct script, label))
1979 #define PADDRH(label) (RELOC_LABELH | offsetof(struct scripth, label))
1980 #define RADDR(label) (RELOC_REGISTER | REG(label))
1981 #define FADDR(label,ofs)(RELOC_REGISTER | ((REG(label))+(ofs)))
1982
1983
1984 static struct script script0 __initdata = {
1985 {
1986
1987
1988
1989
1990 SCR_NO_OP,
1991 0,
1992
1993
1994
1995 SCR_FROM_REG (ctest2),
1996 0,
1997
1998
1999
2000
2001
2002 SCR_JUMP,
2003 },{
2004 PADDRH(tryloop),
2005
2006 },{
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019 SCR_CLR (SCR_TRG),
2020 0,
2021 SCR_LOAD_REG (HS_REG, HS_SELECTING),
2022 0,
2023
2024
2025
2026
2027 SCR_SEL_TBL_ATN ^ offsetof (struct dsb, select),
2028 PADDR (reselect),
2029
2030 },{
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059 SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)),
2060 0,
2061
2062
2063
2064
2065 SCR_COPY (4),
2066 RADDR (temp),
2067 PADDR (startpos),
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077 SCR_COPY_F (4),
2078 RADDR (dsa),
2079 PADDR (loadpos),
2080
2081
2082
2083 PREFETCH_FLUSH
2084
2085
2086
2087 SCR_COPY (sizeof (struct head)),
2088
2089
2090
2091 },{
2092 0,
2093 NADDR (header),
2094
2095
2096
2097
2098 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
2099 PADDR (prepare),
2100
2101 },{
2102
2103
2104
2105
2106
2107 SCR_MOVE_TBL ^ SCR_MSG_OUT,
2108 offsetof (struct dsb, smsg),
2109 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
2110 PADDRH (resend_ident),
2111 SCR_LOAD_REG (scratcha, 0x80),
2112 0,
2113 SCR_COPY (1),
2114 RADDR (scratcha),
2115 NADDR (lastmsg),
2116 },{
2117
2118
2119
2120
2121 SCR_COPY (4),
2122 NADDR (header.savep),
2123 RADDR (temp),
2124
2125
2126
2127 SCR_COPY (4),
2128 NADDR (header.status),
2129 RADDR (scr0),
2130 },{
2131
2132
2133
2134 SCR_LOAD_REG (scratcha, NOP),
2135 0,
2136 SCR_COPY (1),
2137 RADDR (scratcha),
2138 NADDR (msgout),
2139
2140
2141
2142
2143 SCR_JUMP ^ IFFALSE (WHEN (SCR_COMMAND)),
2144 PADDR (dispatch),
2145
2146 },{
2147
2148
2149
2150 SCR_MOVE_TBL ^ SCR_COMMAND,
2151 offsetof (struct dsb, cmd),
2152
2153
2154
2155
2156
2157 SCR_FROM_REG (HS_REG),
2158 0,
2159 SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)),
2160 SIR_NEGO_FAILED,
2161
2162 },{
2163
2164
2165
2166
2167
2168 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
2169 PADDR (msg_in),
2170
2171 SCR_RETURN ^ IFTRUE (IF (SCR_DATA_OUT)),
2172 0,
2173
2174
2175
2176
2177
2178
2179
2180 SCR_JUMPR ^ IFFALSE (IF (SCR_DATA_IN)),
2181 20,
2182 SCR_COPY (4),
2183 RADDR (scratcha),
2184 RADDR (scratcha),
2185 SCR_RETURN,
2186 0,
2187 SCR_JUMP ^ IFTRUE (IF (SCR_STATUS)),
2188 PADDR (status),
2189 SCR_JUMP ^ IFTRUE (IF (SCR_COMMAND)),
2190 PADDR (command),
2191 SCR_JUMP ^ IFTRUE (IF (SCR_MSG_OUT)),
2192 PADDR (msg_out),
2193
2194
2195
2196 SCR_LOAD_REG (scratcha, XE_BAD_PHASE),
2197 0,
2198 SCR_COPY (1),
2199 RADDR (scratcha),
2200 NADDR (xerr_st),
2201 SCR_JUMPR ^ IFFALSE (IF (SCR_ILG_OUT)),
2202 8,
2203 SCR_MOVE_ABS (1) ^ SCR_ILG_OUT,
2204 NADDR (scratch),
2205 SCR_JUMPR ^ IFFALSE (IF (SCR_ILG_IN)),
2206 8,
2207 SCR_MOVE_ABS (1) ^ SCR_ILG_IN,
2208 NADDR (scratch),
2209 SCR_JUMP,
2210 PADDR (dispatch),
2211
2212 },{
2213
2214
2215
2216 SCR_CLR (SCR_ACK),
2217 0,
2218 SCR_JUMP,
2219 PADDR (dispatch),
2220
2221 },{
2222
2223
2224
2225
2226
2227 SCR_LOAD_REG (scratcha, XE_EXTRA_DATA),
2228 0,
2229 SCR_COPY (1),
2230 RADDR (scratcha),
2231 NADDR (xerr_st),
2232
2233
2234
2235 SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_OUT)),
2236 8,
2237 SCR_MOVE_ABS (1) ^ SCR_DATA_OUT,
2238 NADDR (scratch),
2239 SCR_JUMPR ^ IFFALSE (IF (SCR_DATA_IN)),
2240 8,
2241 SCR_MOVE_ABS (1) ^ SCR_DATA_IN,
2242 NADDR (scratch),
2243
2244
2245
2246 SCR_CALL,
2247 PADDR (dispatch),
2248 SCR_JUMP,
2249 PADDR (no_data),
2250
2251 },{
2252
2253
2254
2255 SCR_MOVE_ABS (1) ^ SCR_STATUS,
2256 NADDR (scratch),
2257
2258
2259
2260
2261 SCR_TO_REG (SS_REG),
2262 0,
2263 SCR_LOAD_REG (HS_REG, HS_COMPLETE),
2264 0,
2265 SCR_JUMP,
2266 PADDR (dispatch),
2267 },{
2268
2269
2270
2271
2272
2273
2274
2275 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2276 NADDR (msgin[0]),
2277 },{
2278
2279
2280
2281 SCR_JUMP ^ IFTRUE (DATA (COMMAND_COMPLETE)),
2282 PADDR (complete),
2283 SCR_JUMP ^ IFTRUE (DATA (DISCONNECT)),
2284 PADDR (disconnect),
2285 SCR_JUMP ^ IFTRUE (DATA (SAVE_POINTERS)),
2286 PADDR (save_dp),
2287 SCR_JUMP ^ IFTRUE (DATA (RESTORE_POINTERS)),
2288 PADDR (restore_dp),
2289 SCR_JUMP ^ IFTRUE (DATA (EXTENDED_MESSAGE)),
2290 PADDRH (msg_extended),
2291 SCR_JUMP ^ IFTRUE (DATA (NOP)),
2292 PADDR (clrack),
2293 SCR_JUMP ^ IFTRUE (DATA (MESSAGE_REJECT)),
2294 PADDRH (msg_reject),
2295 SCR_JUMP ^ IFTRUE (DATA (IGNORE_WIDE_RESIDUE)),
2296 PADDRH (msg_ign_residue),
2297
2298
2299
2300
2301
2302
2303
2304 },{
2305
2306
2307
2308 SCR_INT,
2309 SIR_REJECT_SENT,
2310 SCR_LOAD_REG (scratcha, MESSAGE_REJECT),
2311 0,
2312 },{
2313 SCR_COPY (1),
2314 RADDR (scratcha),
2315 NADDR (msgout),
2316 SCR_SET (SCR_ATN),
2317 0,
2318 SCR_JUMP,
2319 PADDR (clrack),
2320 },{
2321
2322
2323
2324
2325
2326
2327 SCR_FROM_REG (dsa),
2328 0,
2329 SCR_JUMP ^ IFTRUE (DATA (0xff)),
2330 PADDR (start),
2331
2332
2333
2334
2335 SCR_JUMP,
2336 PADDR (cleanup_ok),
2337
2338 },{
2339
2340
2341
2342
2343
2344 SCR_COPY (4),
2345 RADDR (temp),
2346 NADDR (header.lastp),
2347
2348
2349
2350
2351
2352
2353
2354
2355 SCR_REG_REG (scntl2, SCR_AND, 0x7f),
2356 0,
2357
2358
2359
2360 SCR_CLR (SCR_ACK|SCR_ATN),
2361 0,
2362
2363
2364
2365 SCR_WAIT_DISC,
2366 0,
2367 },{
2368
2369
2370
2371 SCR_COPY (4),
2372 RADDR (scr0),
2373 NADDR (header.status),
2374
2375
2376
2377 SCR_COPY_F (4),
2378 RADDR (dsa),
2379 PADDR (cleanup0),
2380
2381
2382
2383 PREFETCH_FLUSH
2384 SCR_COPY (sizeof (struct head)),
2385 NADDR (header),
2386 },{
2387 0,
2388 },{
2389
2390
2391
2392 SCR_FROM_REG (HS_REG),
2393 0,
2394
2395
2396
2397 SCR_JUMP ^ IFTRUE (MASK (0, (HS_DONEMASK|HS_SKIPMASK))),
2398 PADDR(start),
2399
2400
2401
2402
2403 SCR_FROM_REG (SS_REG),
2404 0,
2405 SCR_CALL ^ IFFALSE (DATA (SAM_STAT_GOOD)),
2406 PADDRH (bad_status),
2407
2408 #ifndef SCSI_NCR_CCB_DONE_SUPPORT
2409
2410
2411
2412
2413 SCR_INT,
2414 SIR_INTFLY,
2415
2416
2417
2418 SCR_JUMP,
2419 PADDR(start),
2420
2421 #else
2422
2423
2424
2425
2426 SCR_JUMP,
2427 },{
2428 PADDRH (done_queue),
2429 },{
2430 SCR_INT,
2431 SIR_DONE_OVERFLOW,
2432 },{
2433 SCR_INT,
2434 SIR_INTFLY,
2435 SCR_COPY (4),
2436 RADDR (temp),
2437 PADDR (done_pos),
2438 SCR_JUMP,
2439 PADDR (start),
2440
2441 #endif
2442
2443 },{
2444
2445
2446
2447
2448 SCR_COPY (4),
2449 RADDR (temp),
2450 NADDR (header.savep),
2451 SCR_CLR (SCR_ACK),
2452 0,
2453 SCR_JUMP,
2454 PADDR (dispatch),
2455 },{
2456
2457
2458
2459
2460 SCR_COPY (4),
2461 NADDR (header.savep),
2462 RADDR (temp),
2463 SCR_JUMP,
2464 PADDR (clrack),
2465
2466 },{
2467
2468
2469
2470
2471
2472
2473 SCR_REG_REG (scntl2, SCR_AND, 0x7f),
2474 0,
2475 SCR_CLR (SCR_ACK|SCR_ATN),
2476 0,
2477
2478
2479
2480 SCR_WAIT_DISC,
2481 0,
2482
2483
2484
2485 SCR_LOAD_REG (HS_REG, HS_DISCONNECT),
2486 0,
2487 SCR_JUMP,
2488 PADDR (cleanup_ok),
2489
2490 },{
2491
2492
2493
2494 SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
2495 NADDR (msgout),
2496 SCR_COPY (1),
2497 NADDR (msgout),
2498 NADDR (lastmsg),
2499
2500
2501
2502 SCR_JUMP ^ IFTRUE (DATA (ABORT_TASK_SET)),
2503 PADDRH (msg_out_abort),
2504
2505
2506
2507
2508 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
2509 PADDR (msg_out),
2510 },{
2511
2512
2513
2514 SCR_LOAD_REG (scratcha, NOP),
2515 0,
2516 SCR_COPY (4),
2517 RADDR (scratcha),
2518 NADDR (msgout),
2519
2520
2521
2522 SCR_JUMP,
2523 PADDR (dispatch),
2524 },{
2525
2526
2527
2528
2529
2530
2531 SCR_NO_OP,
2532 0,
2533 },{
2534
2535
2536
2537 SCR_LOAD_REG (dsa, 0xff),
2538 0,
2539 SCR_CLR (SCR_TRG),
2540 0,
2541 SCR_LOAD_REG (HS_REG, HS_IN_RESELECT),
2542 0,
2543
2544
2545
2546
2547
2548
2549 SCR_WAIT_RESEL,
2550 PADDR(start),
2551 },{
2552
2553
2554
2555
2556 SCR_NO_OP,
2557 0,
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571 SCR_REG_SFBR (ssid, SCR_AND, 0x8F),
2572 0,
2573 SCR_TO_REG (sdid),
2574 0,
2575 SCR_JUMP,
2576 NADDR (jump_tcb),
2577
2578 },{
2579
2580
2581
2582 SCR_CLR (SCR_ACK),
2583 0,
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593 SCR_COPY_F (4),
2594 RADDR (dsa),
2595 PADDR (loadpos1),
2596
2597
2598
2599 PREFETCH_FLUSH
2600
2601
2602
2603 SCR_COPY (sizeof (struct head)),
2604
2605
2606
2607
2608 },{
2609 0,
2610 NADDR (header),
2611
2612
2613
2614 SCR_JUMP,
2615 PADDR (prepare),
2616
2617 },{
2618
2619
2620
2621
2622
2623 SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
2624 SIR_RESEL_NO_MSG_IN,
2625
2626
2627
2628
2629
2630
2631 SCR_FROM_REG (sbdl),
2632 0,
2633
2634
2635
2636 SCR_RETURN,
2637 0,
2638 },{
2639
2640
2641
2642
2643
2644
2645 SCR_MOVE_ABS (3) ^ SCR_MSG_IN,
2646 NADDR (msgin),
2647
2648
2649
2650
2651
2652
2653
2654 SCR_REG_SFBR (sidl, SCR_SHL, 0),
2655 0,
2656 SCR_SFBR_REG (temp, SCR_AND, 0xfc),
2657 0,
2658 },{
2659 SCR_COPY_F (4),
2660 RADDR (temp),
2661 PADDR (nexus_indirect),
2662
2663
2664
2665 PREFETCH_FLUSH
2666 SCR_COPY (4),
2667 },{
2668 0,
2669 RADDR (temp),
2670 SCR_RETURN,
2671 0,
2672 },{
2673
2674
2675
2676
2677 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2678 NADDR (msgin),
2679 SCR_JUMP,
2680 PADDR (jump_to_nexus),
2681 },{
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696 0
2697 },{
2698 SCR_CALL,
2699 PADDR (dispatch),
2700 SCR_JUMP,
2701 PADDR (no_data),
2702 },{
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717 0
2718 },{
2719 SCR_CALL,
2720 PADDR (dispatch),
2721 SCR_JUMP,
2722 PADDR (no_data),
2723 }
2724 };
2725
2726 static struct scripth scripth0 __initdata = {
2727 {
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746 0
2747 },{
2748 SCR_JUMP,
2749 PADDRH(tryloop),
2750
2751 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
2752
2753 },{
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772 0
2773 },{
2774 SCR_JUMP,
2775 PADDRH (done_queue),
2776
2777 #endif
2778 },{
2779
2780
2781
2782
2783
2784 SCR_CLR (SCR_TRG),
2785 0,
2786 SCR_LOAD_REG (HS_REG, HS_SELECTING),
2787 0,
2788 SCR_SEL_TBL ^ offsetof (struct dsb, select),
2789 PADDR (reselect),
2790 SCR_JUMP,
2791 PADDR (select2),
2792
2793 },{
2794
2795 SCR_LOAD_REG (scratcha, HS_ABORTED),
2796 0,
2797 SCR_JUMPR,
2798 8,
2799 },{
2800 SCR_LOAD_REG (scratcha, 0),
2801 0,
2802
2803
2804
2805
2806 SCR_COPY (4),
2807 RADDR (temp),
2808 PADDR (startpos),
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818 SCR_COPY_F (4),
2819 RADDR (dsa),
2820 PADDRH (skip2),
2821
2822
2823
2824 PREFETCH_FLUSH
2825
2826
2827
2828 SCR_COPY (sizeof (struct head)),
2829
2830
2831
2832 },{
2833 0,
2834 NADDR (header),
2835
2836
2837
2838 SCR_COPY (4),
2839 NADDR (header.status),
2840 RADDR (scr0),
2841
2842
2843
2844 SCR_FROM_REG (scratcha),
2845 0,
2846 SCR_JUMPR ^ IFFALSE (MASK (0, HS_DONEMASK)),
2847 16,
2848 SCR_REG_REG (HS_REG, SCR_OR, HS_SKIPMASK),
2849 0,
2850 SCR_JUMPR,
2851 8,
2852 SCR_TO_REG (HS_REG),
2853 0,
2854 SCR_LOAD_REG (SS_REG, SAM_STAT_GOOD),
2855 0,
2856 SCR_JUMP,
2857 PADDR (cleanup_ok),
2858
2859 },{
2860
2861
2862
2863 SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
2864 PADDRH (par_err_other),
2865 SCR_MOVE_ABS (1) ^ SCR_DATA_IN,
2866 NADDR (scratch),
2867 SCR_JUMPR,
2868 -24,
2869 },{
2870
2871
2872
2873 SCR_REG_REG (PS_REG, SCR_ADD, 0x01),
2874 0,
2875
2876
2877
2878 SCR_JUMP,
2879 PADDR (dispatch),
2880 },{
2881
2882
2883
2884
2885
2886
2887 SCR_FROM_REG (HS_REG),
2888 0,
2889 SCR_INT ^ IFFALSE (DATA (HS_NEGOTIATE)),
2890 SIR_REJECT_RECEIVED,
2891 SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)),
2892 SIR_NEGO_FAILED,
2893 SCR_JUMP,
2894 PADDR (clrack),
2895
2896 },{
2897
2898
2899
2900 SCR_CLR (SCR_ACK),
2901 0,
2902 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
2903 PADDR (dispatch),
2904
2905
2906
2907 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2908 NADDR (msgin[1]),
2909
2910
2911
2912 SCR_JUMP ^ IFTRUE (DATA (0)),
2913 PADDR (clrack),
2914
2915
2916
2917 SCR_JUMPR ^ IFFALSE (DATA (1)),
2918 40,
2919
2920
2921
2922 SCR_FROM_REG (scntl2),
2923 0,
2924 SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)),
2925 16,
2926
2927
2928
2929
2930 SCR_REG_REG (scntl2, SCR_OR, WSR),
2931 0,
2932 SCR_JUMP,
2933 PADDR (clrack),
2934
2935
2936
2937 SCR_FROM_REG (scratcha),
2938 0,
2939 SCR_INT,
2940 SIR_IGN_RESIDUE,
2941 SCR_JUMP,
2942 PADDR (clrack),
2943
2944 },{
2945
2946
2947
2948 SCR_CLR (SCR_ACK),
2949 0,
2950 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
2951 PADDR (dispatch),
2952
2953
2954
2955 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2956 NADDR (msgin[1]),
2957
2958
2959 SCR_JUMP ^ IFTRUE (DATA (3)),
2960 PADDRH (msg_ext_3),
2961 SCR_JUMP ^ IFFALSE (DATA (2)),
2962 PADDR (msg_bad),
2963 },{
2964 SCR_CLR (SCR_ACK),
2965 0,
2966 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
2967 PADDR (dispatch),
2968
2969
2970
2971 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2972 NADDR (msgin[2]),
2973 SCR_JUMP ^ IFTRUE (DATA (EXTENDED_WDTR)),
2974 PADDRH (msg_wdtr),
2975
2976
2977
2978 SCR_JUMP,
2979 PADDR (msg_bad)
2980 },{
2981 SCR_CLR (SCR_ACK),
2982 0,
2983 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
2984 PADDR (dispatch),
2985
2986
2987
2988 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2989 NADDR (msgin[3]),
2990
2991
2992
2993 SCR_INT,
2994 SIR_NEGO_WIDE,
2995
2996
2997
2998 SCR_SET (SCR_ATN),
2999 0,
3000 SCR_CLR (SCR_ACK),
3001 0,
3002 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3003 PADDRH (nego_bad_phase),
3004
3005 },{
3006
3007
3008
3009 SCR_MOVE_ABS (4) ^ SCR_MSG_OUT,
3010 NADDR (msgout),
3011 SCR_COPY (1),
3012 NADDR (msgout),
3013 NADDR (lastmsg),
3014 SCR_JUMP,
3015 PADDR (msg_out_done),
3016
3017 },{
3018 SCR_CLR (SCR_ACK),
3019 0,
3020 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
3021 PADDR (dispatch),
3022
3023
3024
3025 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3026 NADDR (msgin[2]),
3027 SCR_JUMP ^ IFTRUE (DATA (EXTENDED_SDTR)),
3028 PADDRH (msg_sdtr),
3029
3030
3031
3032 SCR_JUMP,
3033 PADDR (msg_bad)
3034
3035 },{
3036 SCR_CLR (SCR_ACK),
3037 0,
3038 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
3039 PADDR (dispatch),
3040
3041
3042
3043 SCR_MOVE_ABS (2) ^ SCR_MSG_IN,
3044 NADDR (msgin[3]),
3045
3046
3047
3048 SCR_INT,
3049 SIR_NEGO_SYNC,
3050
3051
3052
3053 SCR_SET (SCR_ATN),
3054 0,
3055 SCR_CLR (SCR_ACK),
3056 0,
3057 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3058 PADDRH (nego_bad_phase),
3059
3060 },{
3061
3062
3063
3064 SCR_MOVE_ABS (5) ^ SCR_MSG_OUT,
3065 NADDR (msgout),
3066 SCR_COPY (1),
3067 NADDR (msgout),
3068 NADDR (lastmsg),
3069 SCR_JUMP,
3070 PADDR (msg_out_done),
3071
3072 },{
3073 SCR_INT,
3074 SIR_NEGO_PROTO,
3075 SCR_JUMP,
3076 PADDR (dispatch),
3077
3078 },{
3079
3080
3081
3082
3083
3084 SCR_REG_REG (scntl2, SCR_AND, 0x7f),
3085 0,
3086 SCR_CLR (SCR_ACK|SCR_ATN),
3087 0,
3088 SCR_WAIT_DISC,
3089 0,
3090
3091
3092
3093 SCR_LOAD_REG (HS_REG, HS_ABORTED),
3094 0,
3095 SCR_JUMP,
3096 PADDR (cleanup),
3097
3098 },{
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113 0
3114 },{
3115 SCR_JUMP,
3116 PADDR (data_in),
3117
3118 },{
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133 0
3134 },{
3135 SCR_JUMP,
3136 PADDR (data_out),
3137
3138 },{
3139
3140
3141
3142
3143 SCR_LOAD_REG (scratcha, ABORT_TASK),
3144 0,
3145 SCR_JUMP,
3146 PADDRH (abort_resel),
3147 },{
3148
3149
3150
3151 SCR_LOAD_REG (scratcha, ABORT_TASK),
3152 0,
3153 SCR_JUMP,
3154 PADDRH (abort_resel),
3155 },{
3156
3157
3158
3159 SCR_LOAD_REG (scratcha, ABORT_TASK_SET),
3160 0,
3161 },{
3162 SCR_COPY (1),
3163 RADDR (scratcha),
3164 NADDR (msgout),
3165 SCR_SET (SCR_ATN),
3166 0,
3167 SCR_CLR (SCR_ACK),
3168 0,
3169
3170
3171
3172
3173 SCR_REG_REG (scntl2, SCR_AND, 0x7f),
3174 0,
3175 SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
3176 NADDR (msgout),
3177 SCR_COPY (1),
3178 NADDR (msgout),
3179 NADDR (lastmsg),
3180 SCR_CLR (SCR_ACK|SCR_ATN),
3181 0,
3182 SCR_WAIT_DISC,
3183 0,
3184 SCR_JUMP,
3185 PADDR (start),
3186 },{
3187
3188
3189
3190
3191
3192
3193 SCR_SET (SCR_ATN),
3194 0,
3195 SCR_JUMP,
3196 PADDR (send_ident),
3197 },{
3198 SCR_CLR (SCR_ATN),
3199 0,
3200 SCR_JUMP,
3201 },{
3202 0,
3203 },{
3204 SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_IN)),
3205 PADDR (dispatch),
3206 SCR_MOVE_TBL ^ SCR_DATA_IN,
3207 offsetof (struct dsb, sense),
3208 SCR_CALL,
3209 PADDR (dispatch),
3210 SCR_JUMP,
3211 PADDR (no_data),
3212 },{
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225 SCR_JUMPR ^ IFTRUE (WHEN (SCR_DATA_OUT)),
3226 32,
3227
3228
3229
3230
3231 SCR_COPY (4),
3232 NADDR (header.lastp),
3233 NADDR (header.savep),
3234
3235
3236
3237
3238 SCR_COPY (4),
3239 NADDR (header.savep),
3240 RADDR (temp),
3241 SCR_RETURN,
3242 0,
3243
3244
3245
3246 SCR_COPY (4),
3247 NADDR (header.wlastp),
3248 NADDR (header.lastp),
3249 SCR_COPY (4),
3250 NADDR (header.wgoalp),
3251 NADDR (header.goalp),
3252 SCR_JUMPR,
3253 -64,
3254 },{
3255
3256
3257
3258
3259
3260 SCR_JUMPR ^ IFTRUE (MASK (0x80, 0x80)),
3261 16,
3262 SCR_INT,
3263 SIR_RESEL_NO_IDENTIFY,
3264 SCR_JUMP,
3265 PADDRH (reset),
3266
3267
3268
3269
3270
3271
3272
3273 SCR_INT,
3274 SIR_RESEL_BAD_LUN,
3275 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3276 NADDR (msgin),
3277 SCR_JUMP,
3278 PADDRH (abort),
3279 },{
3280
3281
3282
3283
3284
3285 SCR_INT,
3286 SIR_RESEL_BAD_I_T_L,
3287 SCR_JUMP,
3288 PADDRH (abort),
3289 },{
3290
3291
3292
3293
3294
3295 SCR_INT,
3296 SIR_RESEL_BAD_I_T_L_Q,
3297 SCR_JUMP,
3298 PADDRH (aborttag),
3299 },{
3300
3301
3302
3303
3304
3305
3306 SCR_INT,
3307 SIR_RESEL_BAD_TARGET,
3308 SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_IN)),
3309 8,
3310 SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3311 NADDR (msgin),
3312 SCR_JUMP,
3313 PADDRH (reset),
3314 },{
3315
3316
3317
3318
3319
3320 SCR_INT ^ IFTRUE (DATA (SAM_STAT_TASK_SET_FULL)),
3321 SIR_BAD_STATUS,
3322 SCR_INT ^ IFTRUE (DATA (SAM_STAT_CHECK_CONDITION)),
3323 SIR_BAD_STATUS,
3324 SCR_INT ^ IFTRUE (DATA (SAM_STAT_COMMAND_TERMINATED)),
3325 SIR_BAD_STATUS,
3326 SCR_RETURN,
3327 0,
3328 },{
3329
3330
3331
3332
3333 SCR_COPY_F (4),
3334 RADDR (scratcha),
3335 PADDRH (start_ram0),
3336
3337
3338
3339 PREFETCH_FLUSH
3340 SCR_COPY (sizeof (struct script)),
3341 },{
3342 0,
3343 PADDR (start),
3344 SCR_JUMP,
3345 PADDR (start),
3346 },{
3347
3348
3349
3350
3351
3352 SCR_COPY (4),
3353 RADDR (temp),
3354 PADDR (startpos),
3355 SCR_JUMP,
3356 PADDR (start),
3357 },{
3358
3359
3360
3361
3362
3363
3364
3365
3366 SCR_RETURN,
3367 0,
3368 },{
3369
3370
3371
3372 SCR_COPY (4),
3373 NADDR(ncr_cache),
3374 RADDR (scratcha),
3375
3376
3377
3378 SCR_COPY (4),
3379 RADDR (temp),
3380 NADDR(ncr_cache),
3381
3382
3383
3384 SCR_COPY (4),
3385 NADDR(ncr_cache),
3386 RADDR (temp),
3387 },{
3388
3389
3390
3391 SCR_INT,
3392 99,
3393 }
3394 };
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405 void __init ncr_script_fill (struct script * scr, struct scripth * scrh)
3406 {
3407 int i;
3408 ncrcmd *p;
3409
3410 p = scrh->tryloop;
3411 for (i=0; i<MAX_START; i++) {
3412 *p++ =SCR_CALL;
3413 *p++ =PADDR (idle);
3414 }
3415
3416 BUG_ON((u_long)p != (u_long)&scrh->tryloop + sizeof (scrh->tryloop));
3417
3418 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
3419
3420 p = scrh->done_queue;
3421 for (i = 0; i<MAX_DONE; i++) {
3422 *p++ =SCR_COPY (sizeof(struct ccb *));
3423 *p++ =NADDR (header.cp);
3424 *p++ =NADDR (ccb_done[i]);
3425 *p++ =SCR_CALL;
3426 *p++ =PADDR (done_end);
3427 }
3428
3429 BUG_ON((u_long)p != (u_long)&scrh->done_queue+sizeof(scrh->done_queue));
3430
3431 #endif
3432
3433 p = scrh->hdata_in;
3434 for (i=0; i<MAX_SCATTERH; i++) {
3435 *p++ =SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_IN));
3436 *p++ =PADDR (dispatch);
3437 *p++ =SCR_MOVE_TBL ^ SCR_DATA_IN;
3438 *p++ =offsetof (struct dsb, data[i]);
3439 }
3440
3441 BUG_ON((u_long)p != (u_long)&scrh->hdata_in + sizeof (scrh->hdata_in));
3442
3443 p = scr->data_in;
3444 for (i=MAX_SCATTERH; i<MAX_SCATTERH+MAX_SCATTERL; i++) {
3445 *p++ =SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_IN));
3446 *p++ =PADDR (dispatch);
3447 *p++ =SCR_MOVE_TBL ^ SCR_DATA_IN;
3448 *p++ =offsetof (struct dsb, data[i]);
3449 }
3450
3451 BUG_ON((u_long)p != (u_long)&scr->data_in + sizeof (scr->data_in));
3452
3453 p = scrh->hdata_out;
3454 for (i=0; i<MAX_SCATTERH; i++) {
3455 *p++ =SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_OUT));
3456 *p++ =PADDR (dispatch);
3457 *p++ =SCR_MOVE_TBL ^ SCR_DATA_OUT;
3458 *p++ =offsetof (struct dsb, data[i]);
3459 }
3460
3461 BUG_ON((u_long)p != (u_long)&scrh->hdata_out + sizeof (scrh->hdata_out));
3462
3463 p = scr->data_out;
3464 for (i=MAX_SCATTERH; i<MAX_SCATTERH+MAX_SCATTERL; i++) {
3465 *p++ =SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_OUT));
3466 *p++ =PADDR (dispatch);
3467 *p++ =SCR_MOVE_TBL ^ SCR_DATA_OUT;
3468 *p++ =offsetof (struct dsb, data[i]);
3469 }
3470
3471 BUG_ON((u_long) p != (u_long)&scr->data_out + sizeof (scr->data_out));
3472 }
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483 static void __init
3484 ncr_script_copy_and_bind (struct ncb *np, ncrcmd *src, ncrcmd *dst, int len)
3485 {
3486 ncrcmd opcode, new, old, tmp1, tmp2;
3487 ncrcmd *start, *end;
3488 int relocs;
3489 int opchanged = 0;
3490
3491 start = src;
3492 end = src + len/4;
3493
3494 while (src < end) {
3495
3496 opcode = *src++;
3497 *dst++ = cpu_to_scr(opcode);
3498
3499
3500
3501
3502
3503
3504
3505
3506 if (opcode == 0) {
3507 printk (KERN_ERR "%s: ERROR0 IN SCRIPT at %d.\n",
3508 ncr_name(np), (int) (src-start-1));
3509 mdelay(1000);
3510 }
3511
3512 if (DEBUG_FLAGS & DEBUG_SCRIPT)
3513 printk (KERN_DEBUG "%p: <%x>\n",
3514 (src-1), (unsigned)opcode);
3515
3516
3517
3518
3519 switch (opcode >> 28) {
3520
3521 case 0xc:
3522
3523
3524
3525 relocs = 2;
3526 tmp1 = src[0];
3527 #ifdef RELOC_KVAR
3528 if ((tmp1 & RELOC_MASK) == RELOC_KVAR)
3529 tmp1 = 0;
3530 #endif
3531 tmp2 = src[1];
3532 #ifdef RELOC_KVAR
3533 if ((tmp2 & RELOC_MASK) == RELOC_KVAR)
3534 tmp2 = 0;
3535 #endif
3536 if ((tmp1 ^ tmp2) & 3) {
3537 printk (KERN_ERR"%s: ERROR1 IN SCRIPT at %d.\n",
3538 ncr_name(np), (int) (src-start-1));
3539 mdelay(1000);
3540 }
3541
3542
3543
3544
3545 if ((opcode & SCR_NO_FLUSH) && !(np->features & FE_PFEN)) {
3546 dst[-1] = cpu_to_scr(opcode & ~SCR_NO_FLUSH);
3547 ++opchanged;
3548 }
3549 break;
3550
3551 case 0x0:
3552
3553
3554
3555 relocs = 1;
3556 break;
3557
3558 case 0x8:
3559
3560
3561
3562
3563 if (opcode & 0x00800000)
3564 relocs = 0;
3565 else
3566 relocs = 1;
3567 break;
3568
3569 case 0x4:
3570 case 0x5:
3571 case 0x6:
3572 case 0x7:
3573 relocs = 1;
3574 break;
3575
3576 default:
3577 relocs = 0;
3578 break;
3579 }
3580
3581 if (relocs) {
3582 while (relocs--) {
3583 old = *src++;
3584
3585 switch (old & RELOC_MASK) {
3586 case RELOC_REGISTER:
3587 new = (old & ~RELOC_MASK) + np->paddr;
3588 break;
3589 case RELOC_LABEL:
3590 new = (old & ~RELOC_MASK) + np->p_script;
3591 break;
3592 case RELOC_LABELH:
3593 new = (old & ~RELOC_MASK) + np->p_scripth;
3594 break;
3595 case RELOC_SOFTC:
3596 new = (old & ~RELOC_MASK) + np->p_ncb;
3597 break;
3598 #ifdef RELOC_KVAR
3599 case RELOC_KVAR:
3600 if (((old & ~RELOC_MASK) <
3601 SCRIPT_KVAR_FIRST) ||
3602 ((old & ~RELOC_MASK) >
3603 SCRIPT_KVAR_LAST))
3604 panic("ncr KVAR out of range");
3605 new = vtophys(script_kvars[old &
3606 ~RELOC_MASK]);
3607 break;
3608 #endif
3609 case 0:
3610
3611 if (old == 0) {
3612 new = old;
3613 break;
3614 }
3615 fallthrough;
3616 default:
3617 panic("ncr_script_copy_and_bind: weird relocation %x\n", old);
3618 break;
3619 }
3620
3621 *dst++ = cpu_to_scr(new);
3622 }
3623 } else
3624 *dst++ = cpu_to_scr(*src++);
3625
3626 }
3627 }
3628
3629
3630
3631
3632
3633 struct host_data {
3634 struct ncb *ncb;
3635 };
3636
3637 #define PRINT_ADDR(cmd, arg...) dev_info(&cmd->device->sdev_gendev , ## arg)
3638
3639 static void ncr_print_msg(struct ccb *cp, char *label, u_char *msg)
3640 {
3641 PRINT_ADDR(cp->cmd, "%s: ", label);
3642
3643 spi_print_msg(msg);
3644 printk("\n");
3645 }
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656 #define _5M 5000000
3657 static u_long div_10M[] =
3658 {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M};
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677 #define burst_length(bc) (!(bc))? 0 : 1 << (bc)
3678
3679
3680
3681
3682 #define burst_code(dmode, ctest0) \
3683 (ctest0) & 0x80 ? 0 : (((dmode) & 0xc0) >> 6) + 1
3684
3685
3686
3687
3688 static inline void ncr_init_burst(struct ncb *np, u_char bc)
3689 {
3690 u_char *be = &np->rv_ctest0;
3691 *be &= ~0x80;
3692 np->rv_dmode &= ~(0x3 << 6);
3693 np->rv_ctest5 &= ~0x4;
3694
3695 if (!bc) {
3696 *be |= 0x80;
3697 } else {
3698 --bc;
3699 np->rv_dmode |= ((bc & 0x3) << 6);
3700 np->rv_ctest5 |= (bc & 0x4);
3701 }
3702 }
3703
3704 static void __init ncr_prepare_setting(struct ncb *np)
3705 {
3706 u_char burst_max;
3707 u_long period;
3708 int i;
3709
3710
3711
3712
3713
3714 np->sv_scntl0 = INB(nc_scntl0) & 0x0a;
3715 np->sv_scntl3 = INB(nc_scntl3) & 0x07;
3716 np->sv_dmode = INB(nc_dmode) & 0xce;
3717 np->sv_dcntl = INB(nc_dcntl) & 0xa8;
3718 np->sv_ctest0 = INB(nc_ctest0) & 0x84;
3719 np->sv_ctest3 = INB(nc_ctest3) & 0x01;
3720 np->sv_ctest4 = INB(nc_ctest4) & 0x80;
3721 np->sv_ctest5 = INB(nc_ctest5) & 0x24;
3722 np->sv_gpcntl = INB(nc_gpcntl);
3723 np->sv_stest2 = INB(nc_stest2) & 0x20;
3724 np->sv_stest4 = INB(nc_stest4);
3725
3726
3727
3728
3729
3730 np->maxwide = (np->features & FE_WIDE)? 1 : 0;
3731
3732
3733
3734
3735 if (np->features & FE_ULTRA)
3736 np->clock_khz = 80000;
3737 else
3738 np->clock_khz = 40000;
3739
3740
3741
3742
3743 if (np->features & FE_QUAD)
3744 np->multiplier = 4;
3745 else if (np->features & FE_DBLR)
3746 np->multiplier = 2;
3747 else
3748 np->multiplier = 1;
3749
3750
3751
3752
3753
3754 if (np->features & FE_VARCLK)
3755 ncr_getclock(np, np->multiplier);
3756
3757
3758
3759
3760 i = np->clock_divn - 1;
3761 while (--i >= 0) {
3762 if (10ul * SCSI_NCR_MIN_ASYNC * np->clock_khz > div_10M[i]) {
3763 ++i;
3764 break;
3765 }
3766 }
3767 np->rv_scntl3 = i+1;
3768
3769
3770
3771
3772
3773
3774 period = (4 * div_10M[0] + np->clock_khz - 1) / np->clock_khz;
3775 if (period <= 250) np->minsync = 10;
3776 else if (period <= 303) np->minsync = 11;
3777 else if (period <= 500) np->minsync = 12;
3778 else np->minsync = (period + 40 - 1) / 40;
3779
3780
3781
3782
3783
3784 if (np->minsync < 25 && !(np->features & FE_ULTRA))
3785 np->minsync = 25;
3786
3787
3788
3789
3790
3791 period = (11 * div_10M[np->clock_divn - 1]) / (4 * np->clock_khz);
3792 np->maxsync = period > 2540 ? 254 : period / 10;
3793
3794
3795
3796
3797 #if defined SCSI_NCR_TRUST_BIOS_SETTING
3798 np->rv_scntl0 = np->sv_scntl0;
3799 np->rv_dmode = np->sv_dmode;
3800 np->rv_dcntl = np->sv_dcntl;
3801 np->rv_ctest0 = np->sv_ctest0;
3802 np->rv_ctest3 = np->sv_ctest3;
3803 np->rv_ctest4 = np->sv_ctest4;
3804 np->rv_ctest5 = np->sv_ctest5;
3805 burst_max = burst_code(np->sv_dmode, np->sv_ctest0);
3806 #else
3807
3808
3809
3810
3811 burst_max = driver_setup.burst_max;
3812 if (burst_max == 255)
3813 burst_max = burst_code(np->sv_dmode, np->sv_ctest0);
3814 if (burst_max > 7)
3815 burst_max = 7;
3816 if (burst_max > np->maxburst)
3817 burst_max = np->maxburst;
3818
3819
3820
3821
3822 if (np->features & FE_ERL)
3823 np->rv_dmode |= ERL;
3824 if (np->features & FE_BOF)
3825 np->rv_dmode |= BOF;
3826 if (np->features & FE_ERMP)
3827 np->rv_dmode |= ERMP;
3828 if (np->features & FE_PFEN)
3829 np->rv_dcntl |= PFEN;
3830 if (np->features & FE_CLSE)
3831 np->rv_dcntl |= CLSE;
3832 if (np->features & FE_WRIE)
3833 np->rv_ctest3 |= WRIE;
3834 if (np->features & FE_DFS)
3835 np->rv_ctest5 |= DFS;
3836 if (np->features & FE_MUX)
3837 np->rv_ctest4 |= MUX;
3838 if (np->features & FE_EA)
3839 np->rv_dcntl |= EA;
3840 if (np->features & FE_EHP)
3841 np->rv_ctest0 |= EHP;
3842
3843
3844
3845
3846 if (driver_setup.master_parity)
3847 np->rv_ctest4 |= MPEE;
3848 if (driver_setup.scsi_parity)
3849 np->rv_scntl0 |= 0x0a;
3850
3851
3852
3853
3854 if (np->myaddr == 255) {
3855 np->myaddr = INB(nc_scid) & 0x07;
3856 if (!np->myaddr)
3857 np->myaddr = SCSI_NCR_MYADDR;
3858 }
3859
3860 #endif
3861
3862
3863
3864
3865 ncr_init_burst(np, burst_max);
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876 np->scsi_mode = SMODE_SE;
3877 if (np->features & FE_DIFF) {
3878 switch(driver_setup.diff_support) {
3879 case 4:
3880 if (np->sv_scntl3) {
3881 if (np->sv_stest2 & 0x20)
3882 np->scsi_mode = SMODE_HVD;
3883 break;
3884 }
3885 fallthrough;
3886 case 3:
3887 if (INB(nc_gpreg) & 0x08)
3888 break;
3889 fallthrough;
3890 case 2:
3891 np->scsi_mode = SMODE_HVD;
3892 fallthrough;
3893 case 1:
3894 if (np->sv_stest2 & 0x20)
3895 np->scsi_mode = SMODE_HVD;
3896 break;
3897 default:
3898 break;
3899 }
3900 }
3901 if (np->scsi_mode == SMODE_HVD)
3902 np->rv_stest2 |= 0x20;
3903
3904
3905
3906
3907
3908
3909
3910
3911 if ((driver_setup.led_pin) &&
3912 !(np->features & FE_LEDC) && !(np->sv_gpcntl & 0x01))
3913 np->features |= FE_LED0;
3914
3915
3916
3917
3918 switch(driver_setup.irqm & 3) {
3919 case 2:
3920 np->rv_dcntl |= IRQM;
3921 break;
3922 case 1:
3923 np->rv_dcntl |= (np->sv_dcntl & IRQM);
3924 break;
3925 default:
3926 break;
3927 }
3928
3929
3930
3931
3932
3933
3934 for (i = 0 ; i < MAX_TARGET ; i++) {
3935 struct tcb *tp = &np->target[i];
3936
3937 tp->usrsync = driver_setup.default_sync;
3938 tp->usrwide = driver_setup.max_wide;
3939 tp->usrtags = MAX_TAGS;
3940 tp->period = 0xffff;
3941 if (!driver_setup.disconnection)
3942 np->target[i].usrflag = UF_NODISC;
3943 }
3944
3945
3946
3947
3948
3949 printk(KERN_INFO "%s: ID %d, Fast-%d%s%s\n", ncr_name(np),
3950 np->myaddr,
3951 np->minsync < 12 ? 40 : (np->minsync < 25 ? 20 : 10),
3952 (np->rv_scntl0 & 0xa) ? ", Parity Checking" : ", NO Parity",
3953 (np->rv_stest2 & 0x20) ? ", Differential" : "");
3954
3955 if (bootverbose > 1) {
3956 printk (KERN_INFO "%s: initial SCNTL3/DMODE/DCNTL/CTEST3/4/5 = "
3957 "(hex) %02x/%02x/%02x/%02x/%02x/%02x\n",
3958 ncr_name(np), np->sv_scntl3, np->sv_dmode, np->sv_dcntl,
3959 np->sv_ctest3, np->sv_ctest4, np->sv_ctest5);
3960
3961 printk (KERN_INFO "%s: final SCNTL3/DMODE/DCNTL/CTEST3/4/5 = "
3962 "(hex) %02x/%02x/%02x/%02x/%02x/%02x\n",
3963 ncr_name(np), np->rv_scntl3, np->rv_dmode, np->rv_dcntl,
3964 np->rv_ctest3, np->rv_ctest4, np->rv_ctest5);
3965 }
3966
3967 if (bootverbose && np->paddr2)
3968 printk (KERN_INFO "%s: on-chip RAM at 0x%lx\n",
3969 ncr_name(np), np->paddr2);
3970 }
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991 static inline void ncr_queue_done_cmd(struct ncb *np, struct scsi_cmnd *cmd)
3992 {
3993 unmap_scsi_data(np, cmd);
3994 cmd->host_scribble = (char *) np->done_list;
3995 np->done_list = cmd;
3996 }
3997
3998 static inline void ncr_flush_done_cmds(struct scsi_cmnd *lcmd)
3999 {
4000 struct scsi_cmnd *cmd;
4001
4002 while (lcmd) {
4003 cmd = lcmd;
4004 lcmd = (struct scsi_cmnd *) cmd->host_scribble;
4005 scsi_done(cmd);
4006 }
4007 }
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023 static int ncr_prepare_nego(struct ncb *np, struct ccb *cp, u_char *msgptr)
4024 {
4025 struct tcb *tp = &np->target[cp->target];
4026 int msglen = 0;
4027 int nego = 0;
4028 struct scsi_target *starget = tp->starget;
4029
4030
4031 if (!tp->widedone) {
4032 if (spi_support_wide(starget)) {
4033 nego = NS_WIDE;
4034 } else
4035 tp->widedone=1;
4036 }
4037
4038
4039 if (!nego && !tp->period) {
4040 if (spi_support_sync(starget)) {
4041 nego = NS_SYNC;
4042 } else {
4043 tp->period =0xffff;
4044 dev_info(&starget->dev, "target did not report SYNC.\n");
4045 }
4046 }
4047
4048 switch (nego) {
4049 case NS_SYNC:
4050 msglen += spi_populate_sync_msg(msgptr + msglen,
4051 tp->maxoffs ? tp->minsync : 0, tp->maxoffs);
4052 break;
4053 case NS_WIDE:
4054 msglen += spi_populate_width_msg(msgptr + msglen, tp->usrwide);
4055 break;
4056 }
4057
4058 cp->nego_status = nego;
4059
4060 if (nego) {
4061 tp->nego_cp = cp;
4062 if (DEBUG_FLAGS & DEBUG_NEGO) {
4063 ncr_print_msg(cp, nego == NS_WIDE ?
4064 "wide msgout":"sync_msgout", msgptr);
4065 }
4066 }
4067
4068 return msglen;
4069 }
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082 static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
4083 {
4084 struct scsi_device *sdev = cmd->device;
4085 struct tcb *tp = &np->target[sdev->id];
4086 struct lcb *lp = tp->lp[sdev->lun];
4087 struct ccb *cp;
4088
4089 int segments;
4090 u_char idmsg, *msgptr;
4091 u32 msglen;
4092 int direction;
4093 u32 lastp, goalp;
4094
4095
4096
4097
4098
4099
4100
4101 if ((sdev->id == np->myaddr ) ||
4102 (sdev->id >= MAX_TARGET) ||
4103 (sdev->lun >= MAX_LUN )) {
4104 return(DID_BAD_TARGET);
4105 }
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116 if ((cmd->cmnd[0] == 0 || cmd->cmnd[0] == 0x12) &&
4117 (tp->usrflag & UF_NOSCAN)) {
4118 tp->usrflag &= ~UF_NOSCAN;
4119 return DID_BAD_TARGET;
4120 }
4121
4122 if (DEBUG_FLAGS & DEBUG_TINY) {
4123 PRINT_ADDR(cmd, "CMD=%x ", cmd->cmnd[0]);
4124 }
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136 if (np->settle_time && scsi_cmd_to_rq(cmd)->timeout >= HZ) {
4137 u_long tlimit = jiffies + scsi_cmd_to_rq(cmd)->timeout - HZ;
4138 if (time_after(np->settle_time, tlimit))
4139 np->settle_time = tlimit;
4140 }
4141
4142 if (np->settle_time || !(cp=ncr_get_ccb (np, cmd))) {
4143 insert_into_waiting_list(np, cmd);
4144 return(DID_OK);
4145 }
4146 cp->cmd = cmd;
4147
4148
4149
4150
4151
4152
4153
4154
4155 idmsg = IDENTIFY(0, sdev->lun);
4156
4157 if (cp ->tag != NO_TAG ||
4158 (cp != np->ccb && np->disc && !(tp->usrflag & UF_NODISC)))
4159 idmsg |= 0x40;
4160
4161 msgptr = cp->scsi_smsg;
4162 msglen = 0;
4163 msgptr[msglen++] = idmsg;
4164
4165 if (cp->tag != NO_TAG) {
4166 char order = np->order;
4167
4168
4169
4170
4171
4172 if (lp && time_after(jiffies, lp->tags_stime)) {
4173 if (lp->tags_smap) {
4174 order = ORDERED_QUEUE_TAG;
4175 if ((DEBUG_FLAGS & DEBUG_TAGS)||bootverbose>2){
4176 PRINT_ADDR(cmd,
4177 "ordered tag forced.\n");
4178 }
4179 }
4180 lp->tags_stime = jiffies + 3*HZ;
4181 lp->tags_smap = lp->tags_umap;
4182 }
4183
4184 if (order == 0) {
4185
4186
4187
4188 switch (cmd->cmnd[0]) {
4189 case 0x08:
4190 case 0x28:
4191 case 0xa8:
4192 order = SIMPLE_QUEUE_TAG;
4193 break;
4194 default:
4195 order = ORDERED_QUEUE_TAG;
4196 }
4197 }
4198 msgptr[msglen++] = order;
4199
4200
4201
4202
4203
4204 msgptr[msglen++] = (cp->tag << 1) + 1;
4205 }
4206
4207
4208
4209
4210
4211
4212
4213
4214 direction = cmd->sc_data_direction;
4215 if (direction != DMA_NONE) {
4216 segments = ncr_scatter(np, cp, cp->cmd);
4217 if (segments < 0) {
4218 ncr_free_ccb(np, cp);
4219 return(DID_ERROR);
4220 }
4221 }
4222 else {
4223 cp->data_len = 0;
4224 segments = 0;
4225 }
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236 cp->nego_status = 0;
4237
4238 if ((!tp->widedone || !tp->period) && !tp->nego_cp && lp) {
4239 msglen += ncr_prepare_nego (np, cp, msgptr + msglen);
4240 }
4241
4242
4243
4244
4245
4246
4247
4248 if (!cp->data_len)
4249 direction = DMA_NONE;
4250
4251
4252
4253
4254
4255
4256
4257 switch(direction) {
4258 case DMA_BIDIRECTIONAL:
4259 case DMA_TO_DEVICE:
4260 goalp = NCB_SCRIPT_PHYS (np, data_out2) + 8;
4261 if (segments <= MAX_SCATTERL)
4262 lastp = goalp - 8 - (segments * 16);
4263 else {
4264 lastp = NCB_SCRIPTH_PHYS (np, hdata_out2);
4265 lastp -= (segments - MAX_SCATTERL) * 16;
4266 }
4267 if (direction != DMA_BIDIRECTIONAL)
4268 break;
4269 cp->phys.header.wgoalp = cpu_to_scr(goalp);
4270 cp->phys.header.wlastp = cpu_to_scr(lastp);
4271 fallthrough;
4272 case DMA_FROM_DEVICE:
4273 goalp = NCB_SCRIPT_PHYS (np, data_in2) + 8;
4274 if (segments <= MAX_SCATTERL)
4275 lastp = goalp - 8 - (segments * 16);
4276 else {
4277 lastp = NCB_SCRIPTH_PHYS (np, hdata_in2);
4278 lastp -= (segments - MAX_SCATTERL) * 16;
4279 }
4280 break;
4281 default:
4282 case DMA_NONE:
4283 lastp = goalp = NCB_SCRIPT_PHYS (np, no_data);
4284 break;
4285 }
4286
4287
4288
4289
4290
4291 cp->phys.header.lastp = cpu_to_scr(lastp);
4292 cp->phys.header.goalp = cpu_to_scr(goalp);
4293
4294 if (direction == DMA_BIDIRECTIONAL)
4295 cp->phys.header.savep =
4296 cpu_to_scr(NCB_SCRIPTH_PHYS (np, data_io));
4297 else
4298 cp->phys.header.savep= cpu_to_scr(lastp);
4299
4300
4301
4302
4303
4304 cp->startp = cp->phys.header.savep;
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320 cp->start.schedule.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, select));
4321 cp->restart.schedule.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, resel_dsa));
4322
4323
4324
4325 cp->phys.select.sel_id = sdev_id(sdev);
4326 cp->phys.select.sel_scntl3 = tp->wval;
4327 cp->phys.select.sel_sxfer = tp->sval;
4328
4329
4330
4331 cp->phys.smsg.addr = cpu_to_scr(CCB_PHYS (cp, scsi_smsg));
4332 cp->phys.smsg.size = cpu_to_scr(msglen);
4333
4334
4335
4336
4337 memcpy(cp->cdb_buf, cmd->cmnd, min_t(int, cmd->cmd_len, sizeof(cp->cdb_buf)));
4338 cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, cdb_buf[0]));
4339 cp->phys.cmd.size = cpu_to_scr(cmd->cmd_len);
4340
4341
4342
4343
4344 cp->actualquirks = 0;
4345 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
4346 cp->scsi_status = SAM_STAT_ILLEGAL;
4347 cp->parity_status = 0;
4348
4349 cp->xerr_status = XE_OK;
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359 cp->magic = CCB_MAGIC;
4360
4361
4362
4363
4364
4365 cp->auto_sense = 0;
4366 if (lp)
4367 ncr_start_next_ccb(np, lp, 2);
4368 else
4369 ncr_put_start_queue(np, cp);
4370
4371
4372
4373 return DID_OK;
4374 }
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387 static void ncr_start_next_ccb(struct ncb *np, struct lcb *lp, int maxn)
4388 {
4389 struct list_head *qp;
4390 struct ccb *cp;
4391
4392 if (lp->held_ccb)
4393 return;
4394
4395 while (maxn-- && lp->queuedccbs < lp->queuedepth) {
4396 qp = ncr_list_pop(&lp->wait_ccbq);
4397 if (!qp)
4398 break;
4399 ++lp->queuedccbs;
4400 cp = list_entry(qp, struct ccb, link_ccbq);
4401 list_add_tail(qp, &lp->busy_ccbq);
4402 lp->jump_ccb[cp->tag == NO_TAG ? 0 : cp->tag] =
4403 cpu_to_scr(CCB_PHYS (cp, restart));
4404 ncr_put_start_queue(np, cp);
4405 }
4406 }
4407
4408 static void ncr_put_start_queue(struct ncb *np, struct ccb *cp)
4409 {
4410 u16 qidx;
4411
4412
4413
4414
4415 if (!np->squeueput) np->squeueput = 1;
4416 qidx = np->squeueput + 2;
4417 if (qidx >= MAX_START + MAX_START) qidx = 1;
4418
4419 np->scripth->tryloop [qidx] = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
4420 MEMORY_BARRIER();
4421 np->scripth->tryloop [np->squeueput] = cpu_to_scr(CCB_PHYS (cp, start));
4422
4423 np->squeueput = qidx;
4424 ++np->queuedccbs;
4425 cp->queued = 1;
4426
4427 if (DEBUG_FLAGS & DEBUG_QUEUE)
4428 printk ("%s: queuepos=%d.\n", ncr_name (np), np->squeueput);
4429
4430
4431
4432
4433
4434 MEMORY_BARRIER();
4435 OUTB (nc_istat, SIGP);
4436 }
4437
4438
4439 static int ncr_reset_scsi_bus(struct ncb *np, int enab_int, int settle_delay)
4440 {
4441 u32 term;
4442 int retv = 0;
4443
4444 np->settle_time = jiffies + settle_delay * HZ;
4445
4446 if (bootverbose > 1)
4447 printk("%s: resetting, "
4448 "command processing suspended for %d seconds\n",
4449 ncr_name(np), settle_delay);
4450
4451 ncr_chip_reset(np, 100);
4452 udelay(2000);
4453 if (enab_int)
4454 OUTW (nc_sien, RST);
4455
4456
4457
4458
4459 OUTB (nc_stest3, TE);
4460 OUTB (nc_scntl1, CRST);
4461 udelay(200);
4462
4463 if (!driver_setup.bus_check)
4464 goto out;
4465
4466
4467
4468
4469
4470
4471
4472 term = INB(nc_sstat0);
4473 term = ((term & 2) << 7) + ((term & 1) << 17);
4474 term |= ((INB(nc_sstat2) & 0x01) << 26) |
4475 ((INW(nc_sbdl) & 0xff) << 9) |
4476 ((INW(nc_sbdl) & 0xff00) << 10) |
4477 INB(nc_sbcl);
4478
4479 if (!(np->features & FE_WIDE))
4480 term &= 0x3ffff;
4481
4482 if (term != (2<<7)) {
4483 printk("%s: suspicious SCSI data while resetting the BUS.\n",
4484 ncr_name(np));
4485 printk("%s: %sdp0,d7-0,rst,req,ack,bsy,sel,atn,msg,c/d,i/o = "
4486 "0x%lx, expecting 0x%lx\n",
4487 ncr_name(np),
4488 (np->features & FE_WIDE) ? "dp1,d15-8," : "",
4489 (u_long)term, (u_long)(2<<7));
4490 if (driver_setup.bus_check == 1)
4491 retv = 1;
4492 }
4493 out:
4494 OUTB (nc_scntl1, 0);
4495 return retv;
4496 }
4497
4498
4499
4500
4501
4502
4503
4504
4505 static void ncr_start_reset(struct ncb *np)
4506 {
4507 if (!np->settle_time) {
4508 ncr_reset_scsi_bus(np, 1, driver_setup.settle_delay);
4509 }
4510 }
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521 static int ncr_reset_bus (struct ncb *np)
4522 {
4523
4524
4525
4526 if (np->settle_time) {
4527 return FAILED;
4528 }
4529
4530
4531
4532
4533
4534
4535 ncr_start_reset(np);
4536
4537
4538
4539 reset_waiting_list(np);
4540
4541
4542
4543 ncr_wakeup(np, HS_RESET);
4544
4545 return SUCCESS;
4546 }
4547
4548 static void ncr_detach(struct ncb *np)
4549 {
4550 struct ccb *cp;
4551 struct tcb *tp;
4552 struct lcb *lp;
4553 int target, lun;
4554 int i;
4555 char inst_name[16];
4556
4557
4558 strlcpy(inst_name, ncr_name(np), sizeof(inst_name));
4559
4560 printk("%s: releasing host resources\n", ncr_name(np));
4561
4562
4563
4564
4565
4566
4567 #ifdef DEBUG_NCR53C8XX
4568 printk("%s: stopping the timer\n", ncr_name(np));
4569 #endif
4570 np->release_stage = 1;
4571 for (i = 50 ; i && np->release_stage != 2 ; i--)
4572 mdelay(100);
4573 if (np->release_stage != 2)
4574 printk("%s: the timer seems to be already stopped\n", ncr_name(np));
4575 else np->release_stage = 2;
4576
4577
4578
4579
4580
4581 #ifdef DEBUG_NCR53C8XX
4582 printk("%s: disabling chip interrupts\n", ncr_name(np));
4583 #endif
4584 OUTW (nc_sien , 0);
4585 OUTB (nc_dien , 0);
4586
4587
4588
4589
4590
4591
4592 printk("%s: resetting chip\n", ncr_name(np));
4593 ncr_chip_reset(np, 100);
4594
4595 OUTB(nc_dmode, np->sv_dmode);
4596 OUTB(nc_dcntl, np->sv_dcntl);
4597 OUTB(nc_ctest0, np->sv_ctest0);
4598 OUTB(nc_ctest3, np->sv_ctest3);
4599 OUTB(nc_ctest4, np->sv_ctest4);
4600 OUTB(nc_ctest5, np->sv_ctest5);
4601 OUTB(nc_gpcntl, np->sv_gpcntl);
4602 OUTB(nc_stest2, np->sv_stest2);
4603
4604 ncr_selectclock(np, np->sv_scntl3);
4605
4606
4607
4608
4609
4610 while ((cp=np->ccb->link_ccb) != NULL) {
4611 np->ccb->link_ccb = cp->link_ccb;
4612 if (cp->host_status) {
4613 printk("%s: shall free an active ccb (host_status=%d)\n",
4614 ncr_name(np), cp->host_status);
4615 }
4616 #ifdef DEBUG_NCR53C8XX
4617 printk("%s: freeing ccb (%lx)\n", ncr_name(np), (u_long) cp);
4618 #endif
4619 m_free_dma(cp, sizeof(*cp), "CCB");
4620 }
4621
4622
4623
4624 for (target = 0; target < MAX_TARGET ; target++) {
4625 tp=&np->target[target];
4626 for (lun = 0 ; lun < MAX_LUN ; lun++) {
4627 lp = tp->lp[lun];
4628 if (lp) {
4629 #ifdef DEBUG_NCR53C8XX
4630 printk("%s: freeing lp (%lx)\n", ncr_name(np), (u_long) lp);
4631 #endif
4632 if (lp->jump_ccb != &lp->jump_ccb_0)
4633 m_free_dma(lp->jump_ccb,256,"JUMP_CCB");
4634 m_free_dma(lp, sizeof(*lp), "LCB");
4635 }
4636 }
4637 }
4638
4639 if (np->scripth0)
4640 m_free_dma(np->scripth0, sizeof(struct scripth), "SCRIPTH");
4641 if (np->script0)
4642 m_free_dma(np->script0, sizeof(struct script), "SCRIPT");
4643 if (np->ccb)
4644 m_free_dma(np->ccb, sizeof(struct ccb), "CCB");
4645 m_free_dma(np, sizeof(struct ncb), "NCB");
4646
4647 printk("%s: host resources successfully released\n", inst_name);
4648 }
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660 void ncr_complete (struct ncb *np, struct ccb *cp)
4661 {
4662 struct scsi_cmnd *cmd;
4663 struct tcb *tp;
4664 struct lcb *lp;
4665
4666
4667
4668
4669
4670 if (!cp || cp->magic != CCB_MAGIC || !cp->cmd)
4671 return;
4672
4673
4674
4675
4676
4677 if (DEBUG_FLAGS & DEBUG_TINY)
4678 printk ("CCB=%lx STAT=%x/%x\n", (unsigned long)cp,
4679 cp->host_status,cp->scsi_status);
4680
4681
4682
4683
4684
4685 cmd = cp->cmd;
4686 cp->cmd = NULL;
4687 tp = &np->target[cmd->device->id];
4688 lp = tp->lp[cmd->device->lun];
4689
4690
4691
4692
4693
4694
4695
4696 if (cp == tp->nego_cp)
4697 tp->nego_cp = NULL;
4698
4699
4700
4701
4702 if (cp->auto_sense) {
4703 cp->scsi_status = cp->auto_sense;
4704 }
4705
4706
4707
4708
4709
4710
4711 if (lp && lp->held_ccb) {
4712 if (cp == lp->held_ccb) {
4713 list_splice_init(&lp->skip_ccbq, &lp->wait_ccbq);
4714 lp->held_ccb = NULL;
4715 }
4716 }
4717
4718
4719
4720
4721
4722 if (cp->parity_status > 1) {
4723 PRINT_ADDR(cmd, "%d parity error(s).\n",cp->parity_status);
4724 }
4725
4726
4727
4728
4729
4730 if (cp->xerr_status != XE_OK) {
4731 switch (cp->xerr_status) {
4732 case XE_EXTRA_DATA:
4733 PRINT_ADDR(cmd, "extraneous data discarded.\n");
4734 break;
4735 case XE_BAD_PHASE:
4736 PRINT_ADDR(cmd, "invalid scsi phase (4/5).\n");
4737 break;
4738 default:
4739 PRINT_ADDR(cmd, "extended error %d.\n",
4740 cp->xerr_status);
4741 break;
4742 }
4743 if (cp->host_status==HS_COMPLETE)
4744 cp->host_status = HS_FAIL;
4745 }
4746
4747
4748
4749
4750 if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) {
4751 if (cp->host_status != HS_COMPLETE ||
4752 cp->scsi_status != SAM_STAT_GOOD) {
4753 PRINT_ADDR(cmd, "ERROR: cmd=%x host_status=%x "
4754 "scsi_status=%x\n", cmd->cmnd[0],
4755 cp->host_status, cp->scsi_status);
4756 }
4757 }
4758
4759
4760
4761
4762 cmd->result = 0;
4763 if ( (cp->host_status == HS_COMPLETE)
4764 && (cp->scsi_status == SAM_STAT_GOOD ||
4765 cp->scsi_status == SAM_STAT_CONDITION_MET)) {
4766
4767
4768
4769
4770
4771 set_status_byte(cmd, cp->scsi_status);
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783 if (!lp)
4784 ncr_alloc_lcb (np, cmd->device->id, cmd->device->lun);
4785
4786 tp->bytes += cp->data_len;
4787 tp->transfers ++;
4788
4789
4790
4791
4792
4793 if (lp && lp->usetags && lp->numtags < lp->maxtags) {
4794 ++lp->num_good;
4795 if (lp->num_good >= 1000) {
4796 lp->num_good = 0;
4797 ++lp->numtags;
4798 ncr_setup_tags (np, cmd->device);
4799 }
4800 }
4801 } else if ((cp->host_status == HS_COMPLETE)
4802 && (cp->scsi_status == SAM_STAT_CHECK_CONDITION)) {
4803
4804
4805
4806 set_status_byte(cmd, SAM_STAT_CHECK_CONDITION);
4807
4808
4809
4810
4811 memcpy(cmd->sense_buffer, cp->sense_buf,
4812 min_t(size_t, SCSI_SENSE_BUFFERSIZE,
4813 sizeof(cp->sense_buf)));
4814
4815 if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) {
4816 u_char *p = cmd->sense_buffer;
4817 int i;
4818 PRINT_ADDR(cmd, "sense data:");
4819 for (i=0; i<14; i++) printk (" %x", *p++);
4820 printk (".\n");
4821 }
4822 } else if ((cp->host_status == HS_COMPLETE)
4823 && (cp->scsi_status == SAM_STAT_RESERVATION_CONFLICT)) {
4824
4825
4826
4827 set_status_byte(cmd, SAM_STAT_RESERVATION_CONFLICT);
4828
4829 } else if ((cp->host_status == HS_COMPLETE)
4830 && (cp->scsi_status == SAM_STAT_BUSY ||
4831 cp->scsi_status == SAM_STAT_TASK_SET_FULL)) {
4832
4833
4834
4835
4836 set_status_byte(cmd, cp->scsi_status);
4837
4838 } else if ((cp->host_status == HS_SEL_TIMEOUT)
4839 || (cp->host_status == HS_TIMEOUT)) {
4840
4841
4842
4843
4844 set_status_byte(cmd, cp->scsi_status);
4845 set_host_byte(cmd, DID_TIME_OUT);
4846
4847 } else if (cp->host_status == HS_RESET) {
4848
4849
4850
4851
4852 set_status_byte(cmd, cp->scsi_status);
4853 set_host_byte(cmd, DID_RESET);
4854
4855 } else if (cp->host_status == HS_ABORTED) {
4856
4857
4858
4859
4860 set_status_byte(cmd, cp->scsi_status);
4861 set_host_byte(cmd, DID_ABORT);
4862
4863 } else {
4864
4865
4866
4867
4868 PRINT_ADDR(cmd, "COMMAND FAILED (%x %x) @%p.\n",
4869 cp->host_status, cp->scsi_status, cp);
4870
4871 set_status_byte(cmd, cp->scsi_status);
4872 set_host_byte(cmd, DID_ERROR);
4873 }
4874
4875
4876
4877
4878
4879 if (tp->usrflag & UF_TRACE) {
4880 u_char * p;
4881 int i;
4882 PRINT_ADDR(cmd, " CMD:");
4883 p = (u_char*) &cmd->cmnd[0];
4884 for (i=0; i<cmd->cmd_len; i++) printk (" %x", *p++);
4885
4886 if (cp->host_status==HS_COMPLETE) {
4887 switch (cp->scsi_status) {
4888 case SAM_STAT_GOOD:
4889 printk (" GOOD");
4890 break;
4891 case SAM_STAT_CHECK_CONDITION:
4892 printk (" SENSE:");
4893 p = (u_char*) &cmd->sense_buffer;
4894 for (i=0; i<14; i++)
4895 printk (" %x", *p++);
4896 break;
4897 default:
4898 printk (" STAT: %x\n", cp->scsi_status);
4899 break;
4900 }
4901 } else printk (" HOSTERROR: %x", cp->host_status);
4902 printk ("\n");
4903 }
4904
4905
4906
4907
4908 ncr_free_ccb (np, cp);
4909
4910
4911
4912
4913 if (lp && lp->queuedccbs < lp->queuedepth &&
4914 !list_empty(&lp->wait_ccbq))
4915 ncr_start_next_ccb(np, lp, 2);
4916
4917
4918
4919
4920 if (np->waiting_list)
4921 requeue_waiting_list(np);
4922
4923
4924
4925
4926 ncr_queue_done_cmd(np, cmd);
4927 }
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942 static void ncr_ccb_skipped(struct ncb *np, struct ccb *cp)
4943 {
4944 struct tcb *tp = &np->target[cp->target];
4945 struct lcb *lp = tp->lp[cp->lun];
4946
4947 if (lp && cp != np->ccb) {
4948 cp->host_status &= ~HS_SKIPMASK;
4949 cp->start.schedule.l_paddr =
4950 cpu_to_scr(NCB_SCRIPT_PHYS (np, select));
4951 list_move_tail(&cp->link_ccbq, &lp->skip_ccbq);
4952 if (cp->queued) {
4953 --lp->queuedccbs;
4954 }
4955 }
4956 if (cp->queued) {
4957 --np->queuedccbs;
4958 cp->queued = 0;
4959 }
4960 }
4961
4962
4963
4964
4965
4966 void ncr_wakeup_done (struct ncb *np)
4967 {
4968 struct ccb *cp;
4969 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
4970 int i, j;
4971
4972 i = np->ccb_done_ic;
4973 while (1) {
4974 j = i+1;
4975 if (j >= MAX_DONE)
4976 j = 0;
4977
4978 cp = np->ccb_done[j];
4979 if (!CCB_DONE_VALID(cp))
4980 break;
4981
4982 np->ccb_done[j] = (struct ccb *)CCB_DONE_EMPTY;
4983 np->scripth->done_queue[5*j + 4] =
4984 cpu_to_scr(NCB_SCRIPT_PHYS (np, done_plug));
4985 MEMORY_BARRIER();
4986 np->scripth->done_queue[5*i + 4] =
4987 cpu_to_scr(NCB_SCRIPT_PHYS (np, done_end));
4988
4989 if (cp->host_status & HS_DONEMASK)
4990 ncr_complete (np, cp);
4991 else if (cp->host_status & HS_SKIPMASK)
4992 ncr_ccb_skipped (np, cp);
4993
4994 i = j;
4995 }
4996 np->ccb_done_ic = i;
4997 #else
4998 cp = np->ccb;
4999 while (cp) {
5000 if (cp->host_status & HS_DONEMASK)
5001 ncr_complete (np, cp);
5002 else if (cp->host_status & HS_SKIPMASK)
5003 ncr_ccb_skipped (np, cp);
5004 cp = cp->link_ccb;
5005 }
5006 #endif
5007 }
5008
5009
5010
5011
5012 void ncr_wakeup (struct ncb *np, u_long code)
5013 {
5014 struct ccb *cp = np->ccb;
5015
5016 while (cp) {
5017 if (cp->host_status != HS_IDLE) {
5018 cp->host_status = code;
5019 ncr_complete (np, cp);
5020 }
5021 cp = cp->link_ccb;
5022 }
5023 }
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033 static void ncr_chip_reset(struct ncb *np, int delay)
5034 {
5035 OUTB (nc_istat, SRST);
5036 udelay(delay);
5037 OUTB (nc_istat, 0 );
5038
5039 if (np->features & FE_EHP)
5040 OUTB (nc_ctest0, EHP);
5041 if (np->features & FE_MUX)
5042 OUTB (nc_ctest4, MUX);
5043 }
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055 void ncr_init (struct ncb *np, int reset, char * msg, u_long code)
5056 {
5057 int i;
5058
5059
5060
5061
5062
5063 if (reset) {
5064 OUTB (nc_istat, SRST);
5065 udelay(100);
5066 }
5067 else {
5068 OUTB (nc_stest3, TE|CSF);
5069 OUTONB (nc_ctest3, CLF);
5070 }
5071
5072
5073
5074
5075
5076 if (msg) printk (KERN_INFO "%s: restart (%s).\n", ncr_name (np), msg);
5077
5078
5079
5080
5081 np->queuedepth = MAX_START - 1;
5082 for (i = 1; i < MAX_START + MAX_START; i += 2)
5083 np->scripth0->tryloop[i] =
5084 cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
5085
5086
5087
5088
5089 np->squeueput = 0;
5090 np->script0->startpos[0] = cpu_to_scr(NCB_SCRIPTH_PHYS (np, tryloop));
5091
5092 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
5093
5094
5095
5096 for (i = 0; i < MAX_DONE; i++) {
5097 np->ccb_done[i] = (struct ccb *)CCB_DONE_EMPTY;
5098 np->scripth0->done_queue[5*i + 4] =
5099 cpu_to_scr(NCB_SCRIPT_PHYS (np, done_end));
5100 }
5101 #endif
5102
5103
5104
5105
5106 np->script0->done_pos[0] = cpu_to_scr(NCB_SCRIPTH_PHYS (np,done_queue));
5107 np->ccb_done_ic = MAX_DONE-1;
5108 np->scripth0->done_queue[5*(MAX_DONE-1) + 4] =
5109 cpu_to_scr(NCB_SCRIPT_PHYS (np, done_plug));
5110
5111
5112
5113
5114 ncr_wakeup (np, code);
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124 ncr_chip_reset(np, 2000);
5125
5126 OUTB (nc_scntl0, np->rv_scntl0 | 0xc0);
5127
5128 OUTB (nc_scntl1, 0x00);
5129
5130 ncr_selectclock(np, np->rv_scntl3);
5131
5132 OUTB (nc_scid , RRE|np->myaddr);
5133 OUTW (nc_respid, 1ul<<np->myaddr);
5134 OUTB (nc_istat , SIGP );
5135 OUTB (nc_dmode , np->rv_dmode);
5136 OUTB (nc_ctest5, np->rv_ctest5);
5137
5138 OUTB (nc_dcntl , NOCOM|np->rv_dcntl);
5139 OUTB (nc_ctest0, np->rv_ctest0);
5140 OUTB (nc_ctest3, np->rv_ctest3);
5141 OUTB (nc_ctest4, np->rv_ctest4);
5142
5143 OUTB (nc_stest2, EXT|np->rv_stest2);
5144 OUTB (nc_stest3, TE);
5145 OUTB (nc_stime0, 0x0c );
5146
5147
5148
5149
5150
5151 np->disc = 0;
5152
5153
5154
5155
5156
5157 if (np->features & FE_LED0) {
5158 OUTOFFB (nc_gpcntl, 0x01);
5159 }
5160
5161
5162
5163
5164
5165 OUTW (nc_sien , STO|HTH|MA|SGE|UDC|RST|PAR);
5166 OUTB (nc_dien , MDPE|BF|ABRT|SSI|SIR|IID);
5167
5168
5169
5170
5171
5172
5173
5174
5175 for (i=0;i<MAX_TARGET;i++) {
5176 struct tcb *tp = &np->target[i];
5177
5178 tp->sval = 0;
5179 tp->wval = np->rv_scntl3;
5180
5181 if (tp->usrsync != 255) {
5182 if (tp->usrsync <= np->maxsync) {
5183 if (tp->usrsync < np->minsync) {
5184 tp->usrsync = np->minsync;
5185 }
5186 }
5187 else
5188 tp->usrsync = 255;
5189 }
5190
5191 if (tp->usrwide > np->maxwide)
5192 tp->usrwide = np->maxwide;
5193
5194 }
5195
5196
5197
5198
5199 if (np->paddr2) {
5200 if (bootverbose)
5201 printk ("%s: Downloading SCSI SCRIPTS.\n",
5202 ncr_name(np));
5203 OUTL (nc_scratcha, vtobus(np->script0));
5204 OUTL_DSP (NCB_SCRIPTH_PHYS (np, start_ram));
5205 }
5206 else
5207 OUTL_DSP (NCB_SCRIPT_PHYS (np, start));
5208 }
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218 static void ncr_negotiate (struct ncb* np, struct tcb* tp)
5219 {
5220
5221
5222
5223
5224 u_long minsync = tp->usrsync;
5225
5226
5227
5228
5229
5230 if (np->scsi_mode && np->scsi_mode == SMODE_SE) {
5231 if (minsync < 12) minsync = 12;
5232 }
5233
5234
5235
5236
5237
5238 if (minsync < np->minsync)
5239 minsync = np->minsync;
5240
5241
5242
5243
5244
5245 if (minsync > np->maxsync)
5246 minsync = 255;
5247
5248 if (tp->maxoffs > np->maxoffs)
5249 tp->maxoffs = np->maxoffs;
5250
5251 tp->minsync = minsync;
5252 tp->maxoffs = (minsync<255 ? tp->maxoffs : 0);
5253
5254
5255
5256
5257
5258 tp->period=0;
5259
5260
5261
5262
5263 tp->widedone=0;
5264 }
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276 static void ncr_getsync(struct ncb *np, u_char sfac, u_char *fakp, u_char *scntl3p)
5277 {
5278 u_long clk = np->clock_khz;
5279 int div = np->clock_divn;
5280 u_long fak;
5281 u_long per;
5282 u_long kpc;
5283
5284
5285
5286
5287 if (sfac <= 10) per = 250;
5288 else if (sfac == 11) per = 303;
5289 else if (sfac == 12) per = 500;
5290 else per = 40 * sfac;
5291
5292
5293
5294
5295
5296 kpc = per * clk;
5297 while (--div > 0)
5298 if (kpc >= (div_10M[div] << 2)) break;
5299
5300
5301
5302
5303
5304 fak = (kpc - 1) / div_10M[div] + 1;
5305
5306 if (fak < 4) fak = 4;
5307
5308
5309
5310
5311 *fakp = fak - 4;
5312 *scntl3p = ((div+1) << 4) + (sfac < 25 ? 0x80 : 0);
5313 }
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324 static void ncr_set_sync_wide_status (struct ncb *np, u_char target)
5325 {
5326 struct ccb *cp;
5327 struct tcb *tp = &np->target[target];
5328
5329
5330
5331
5332 OUTB (nc_sxfer, tp->sval);
5333 np->sync_st = tp->sval;
5334 OUTB (nc_scntl3, tp->wval);
5335 np->wide_st = tp->wval;
5336
5337
5338
5339
5340 for (cp = np->ccb; cp; cp = cp->link_ccb) {
5341 if (!cp->cmd) continue;
5342 if (scmd_id(cp->cmd) != target) continue;
5343 cp->phys.select.sel_scntl3 = tp->wval;
5344 cp->phys.select.sel_sxfer = tp->sval;
5345 }
5346 }
5347
5348
5349
5350
5351
5352
5353
5354
5355 static void ncr_setsync (struct ncb *np, struct ccb *cp, u_char scntl3, u_char sxfer)
5356 {
5357 struct scsi_cmnd *cmd = cp->cmd;
5358 struct tcb *tp;
5359 u_char target = INB (nc_sdid) & 0x0f;
5360 u_char idiv;
5361
5362 BUG_ON(target != (scmd_id(cmd) & 0xf));
5363
5364 tp = &np->target[target];
5365
5366 if (!scntl3 || !(sxfer & 0x1f))
5367 scntl3 = np->rv_scntl3;
5368 scntl3 = (scntl3 & 0xf0) | (tp->wval & EWS) | (np->rv_scntl3 & 0x07);
5369
5370
5371
5372
5373
5374
5375 idiv = ((scntl3 >> 4) & 0x7);
5376 if ((sxfer & 0x1f) && idiv)
5377 tp->period = (((sxfer>>5)+4)*div_10M[idiv-1])/np->clock_khz;
5378 else
5379 tp->period = 0xffff;
5380
5381
5382 if (tp->sval == sxfer && tp->wval == scntl3)
5383 return;
5384 tp->sval = sxfer;
5385 tp->wval = scntl3;
5386
5387 if (sxfer & 0x01f) {
5388
5389 if (tp->period <= 2000)
5390 OUTOFFB(nc_stest2, EXT);
5391 }
5392
5393 spi_display_xfer_agreement(tp->starget);
5394
5395
5396
5397
5398
5399 ncr_set_sync_wide_status(np, target);
5400 }
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412 static void ncr_setwide (struct ncb *np, struct ccb *cp, u_char wide, u_char ack)
5413 {
5414 struct scsi_cmnd *cmd = cp->cmd;
5415 u16 target = INB (nc_sdid) & 0x0f;
5416 struct tcb *tp;
5417 u_char scntl3;
5418 u_char sxfer;
5419
5420 BUG_ON(target != (scmd_id(cmd) & 0xf));
5421
5422 tp = &np->target[target];
5423 tp->widedone = wide+1;
5424 scntl3 = (tp->wval & (~EWS)) | (wide ? EWS : 0);
5425
5426 sxfer = ack ? 0 : tp->sval;
5427
5428
5429
5430
5431 if (tp->sval == sxfer && tp->wval == scntl3) return;
5432 tp->sval = sxfer;
5433 tp->wval = scntl3;
5434
5435
5436
5437
5438 if (bootverbose >= 2) {
5439 dev_info(&cmd->device->sdev_target->dev, "WIDE SCSI %sabled.\n",
5440 (scntl3 & EWS) ? "en" : "dis");
5441 }
5442
5443
5444
5445
5446
5447 ncr_set_sync_wide_status(np, target);
5448 }
5449
5450
5451
5452
5453
5454
5455
5456
5457 static void ncr_setup_tags (struct ncb *np, struct scsi_device *sdev)
5458 {
5459 unsigned char tn = sdev->id, ln = sdev->lun;
5460 struct tcb *tp = &np->target[tn];
5461 struct lcb *lp = tp->lp[ln];
5462 u_char reqtags, maxdepth;
5463
5464
5465
5466
5467 if ((!tp) || (!lp) || !sdev)
5468 return;
5469
5470
5471
5472
5473 if (!lp->scdev_depth)
5474 return;
5475
5476
5477
5478
5479
5480
5481 maxdepth = lp->scdev_depth;
5482 if (maxdepth > lp->maxnxs) maxdepth = lp->maxnxs;
5483 if (lp->maxtags > maxdepth) lp->maxtags = maxdepth;
5484 if (lp->numtags > maxdepth) lp->numtags = maxdepth;
5485
5486
5487
5488
5489
5490
5491 if (sdev->tagged_supported && lp->numtags > 1) {
5492 reqtags = lp->numtags;
5493 } else {
5494 reqtags = 1;
5495 }
5496
5497
5498
5499
5500 lp->numtags = reqtags;
5501 if (lp->numtags > lp->maxtags)
5502 lp->maxtags = lp->numtags;
5503
5504
5505
5506
5507
5508 if (reqtags > 1 && lp->usetags) {
5509 if (lp->queuedepth == reqtags)
5510 return;
5511 lp->queuedepth = reqtags;
5512 }
5513 else if (reqtags <= 1 && !lp->usetags) {
5514 lp->queuedepth = reqtags;
5515 return;
5516 }
5517 else {
5518 if (lp->busyccbs)
5519 return;
5520 lp->queuedepth = reqtags;
5521 lp->usetags = reqtags > 1 ? 1 : 0;
5522 }
5523
5524
5525
5526
5527 lp->jump_tag.l_paddr = lp->usetags?
5528 cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_tag)) :
5529 cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag));
5530
5531
5532
5533
5534 if (bootverbose) {
5535 if (lp->usetags) {
5536 dev_info(&sdev->sdev_gendev,
5537 "tagged command queue depth set to %d\n",
5538 reqtags);
5539 } else {
5540 dev_info(&sdev->sdev_gendev,
5541 "tagged command queueing disabled\n");
5542 }
5543 }
5544 }
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560 static void ncr_timeout (struct ncb *np)
5561 {
5562 u_long thistime = jiffies;
5563
5564
5565
5566
5567
5568
5569
5570 if (np->release_stage) {
5571 if (np->release_stage == 1) np->release_stage = 2;
5572 return;
5573 }
5574
5575 np->timer.expires = jiffies + SCSI_NCR_TIMER_INTERVAL;
5576 add_timer(&np->timer);
5577
5578
5579
5580
5581
5582 if (np->settle_time) {
5583 if (np->settle_time <= thistime) {
5584 if (bootverbose > 1)
5585 printk("%s: command processing resumed\n", ncr_name(np));
5586 np->settle_time = 0;
5587 np->disc = 1;
5588 requeue_waiting_list(np);
5589 }
5590 return;
5591 }
5592
5593
5594
5595
5596
5597
5598 if (np->lasttime + 4*HZ < thistime) {
5599
5600
5601
5602 np->lasttime = thistime;
5603 }
5604
5605 #ifdef SCSI_NCR_BROKEN_INTR
5606 if (INB(nc_istat) & (INTF|SIP|DIP)) {
5607
5608
5609
5610
5611 if (DEBUG_FLAGS & DEBUG_TINY) printk ("{");
5612 ncr_exception (np);
5613 if (DEBUG_FLAGS & DEBUG_TINY) printk ("}");
5614 }
5615 #endif
5616 }
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648 static void ncr_log_hard_error(struct ncb *np, u16 sist, u_char dstat)
5649 {
5650 u32 dsp;
5651 int script_ofs;
5652 int script_size;
5653 char *script_name;
5654 u_char *script_base;
5655 int i;
5656
5657 dsp = INL (nc_dsp);
5658
5659 if (dsp > np->p_script && dsp <= np->p_script + sizeof(struct script)) {
5660 script_ofs = dsp - np->p_script;
5661 script_size = sizeof(struct script);
5662 script_base = (u_char *) np->script0;
5663 script_name = "script";
5664 }
5665 else if (np->p_scripth < dsp &&
5666 dsp <= np->p_scripth + sizeof(struct scripth)) {
5667 script_ofs = dsp - np->p_scripth;
5668 script_size = sizeof(struct scripth);
5669 script_base = (u_char *) np->scripth0;
5670 script_name = "scripth";
5671 } else {
5672 script_ofs = dsp;
5673 script_size = 0;
5674 script_base = NULL;
5675 script_name = "mem";
5676 }
5677
5678 printk ("%s:%d: ERROR (%x:%x) (%x-%x-%x) (%x/%x) @ (%s %x:%08x).\n",
5679 ncr_name (np), (unsigned)INB (nc_sdid)&0x0f, dstat, sist,
5680 (unsigned)INB (nc_socl), (unsigned)INB (nc_sbcl), (unsigned)INB (nc_sbdl),
5681 (unsigned)INB (nc_sxfer),(unsigned)INB (nc_scntl3), script_name, script_ofs,
5682 (unsigned)INL (nc_dbc));
5683
5684 if (((script_ofs & 3) == 0) &&
5685 (unsigned)script_ofs < script_size) {
5686 printk ("%s: script cmd = %08x\n", ncr_name(np),
5687 scr_to_cpu((int) *(ncrcmd *)(script_base + script_ofs)));
5688 }
5689
5690 printk ("%s: regdump:", ncr_name(np));
5691 for (i=0; i<16;i++)
5692 printk (" %02x", (unsigned)INB_OFF(i));
5693 printk (".\n");
5694 }
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728 void ncr_exception (struct ncb *np)
5729 {
5730 u_char istat, dstat;
5731 u16 sist;
5732 int i;
5733
5734
5735
5736
5737
5738
5739
5740
5741 istat = INB (nc_istat);
5742 if (istat & INTF) {
5743 OUTB (nc_istat, (istat & SIGP) | INTF);
5744 istat = INB (nc_istat);
5745 if (DEBUG_FLAGS & DEBUG_TINY) printk ("F ");
5746 ncr_wakeup_done (np);
5747 }
5748
5749 if (!(istat & (SIP|DIP)))
5750 return;
5751
5752 if (istat & CABRT)
5753 OUTB (nc_istat, CABRT);
5754
5755
5756
5757
5758
5759
5760 sist = (istat & SIP) ? INW (nc_sist) : 0;
5761 dstat = (istat & DIP) ? INB (nc_dstat) : 0;
5762
5763 if (DEBUG_FLAGS & DEBUG_TINY)
5764 printk ("<%d|%x:%x|%x:%x>",
5765 (int)INB(nc_scr0),
5766 dstat,sist,
5767 (unsigned)INL(nc_dsp),
5768 (unsigned)INL(nc_dbc));
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783 if (!(sist & (STO|GEN|HTH|SGE|UDC|RST)) &&
5784 !(dstat & (MDPE|BF|ABRT|IID))) {
5785 if ((sist & SBMC) && ncr_int_sbmc (np))
5786 return;
5787 if ((sist & PAR) && ncr_int_par (np))
5788 return;
5789 if (sist & MA) {
5790 ncr_int_ma (np);
5791 return;
5792 }
5793 if (dstat & SIR) {
5794 ncr_int_sir (np);
5795 return;
5796 }
5797
5798
5799
5800 if (!(sist & (SBMC|PAR)) && !(dstat & SSI)) {
5801 printk( "%s: unknown interrupt(s) ignored, "
5802 "ISTAT=%x DSTAT=%x SIST=%x\n",
5803 ncr_name(np), istat, dstat, sist);
5804 return;
5805 }
5806 OUTONB_STD ();
5807 return;
5808 }
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825 if (sist & RST) {
5826 ncr_init (np, 1, bootverbose ? "scsi reset" : NULL, HS_RESET);
5827 return;
5828 }
5829
5830 if ((sist & STO) &&
5831 !(dstat & (MDPE|BF|ABRT))) {
5832
5833
5834
5835 OUTONB (nc_ctest3, CLF);
5836
5837 ncr_int_sto (np);
5838 return;
5839 }
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854 if (time_after(jiffies, np->regtime)) {
5855 np->regtime = jiffies + 10*HZ;
5856 for (i = 0; i<sizeof(np->regdump); i++)
5857 ((char*)&np->regdump)[i] = INB_OFF(i);
5858 np->regdump.nc_dstat = dstat;
5859 np->regdump.nc_sist = sist;
5860 }
5861
5862 ncr_log_hard_error(np, sist, dstat);
5863
5864 printk ("%s: have to clear fifos.\n", ncr_name (np));
5865 OUTB (nc_stest3, TE|CSF);
5866 OUTONB (nc_ctest3, CLF);
5867
5868 if ((sist & (SGE)) ||
5869 (dstat & (MDPE|BF|ABRT|IID))) {
5870 ncr_start_reset(np);
5871 return;
5872 }
5873
5874 if (sist & HTH) {
5875 printk ("%s: handshake timeout\n", ncr_name(np));
5876 ncr_start_reset(np);
5877 return;
5878 }
5879
5880 if (sist & UDC) {
5881 printk ("%s: unexpected disconnect\n", ncr_name(np));
5882 OUTB (HS_PRT, HS_UNEXPECTED);
5883 OUTL_DSP (NCB_SCRIPT_PHYS (np, cleanup));
5884 return;
5885 }
5886
5887
5888
5889
5890
5891
5892 printk ("%s: unknown interrupt\n", ncr_name(np));
5893 }
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911 void ncr_int_sto (struct ncb *np)
5912 {
5913 u_long dsa;
5914 struct ccb *cp;
5915 if (DEBUG_FLAGS & DEBUG_TINY) printk ("T");
5916
5917
5918
5919
5920
5921 dsa = INL (nc_dsa);
5922 cp = np->ccb;
5923 while (cp && (CCB_PHYS (cp, phys) != dsa))
5924 cp = cp->link_ccb;
5925
5926 if (cp) {
5927 cp-> host_status = HS_SEL_TIMEOUT;
5928 ncr_complete (np, cp);
5929 }
5930
5931
5932
5933
5934
5935 OUTL_DSP (NCB_SCRIPTH_PHYS (np, sto_restart));
5936 return;
5937 }
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956 static int ncr_int_sbmc (struct ncb *np)
5957 {
5958 u_char scsi_mode = INB (nc_stest4) & SMODE;
5959
5960 if (scsi_mode != np->scsi_mode) {
5961 printk("%s: SCSI bus mode change from %x to %x.\n",
5962 ncr_name(np), np->scsi_mode, scsi_mode);
5963
5964 np->scsi_mode = scsi_mode;
5965
5966
5967
5968
5969
5970
5971 np->settle_time = jiffies + HZ;
5972 ncr_init (np, 0, bootverbose ? "scsi mode change" : NULL, HS_RESET);
5973 return 1;
5974 }
5975 return 0;
5976 }
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988 static int ncr_int_par (struct ncb *np)
5989 {
5990 u_char hsts = INB (HS_PRT);
5991 u32 dbc = INL (nc_dbc);
5992 u_char sstat1 = INB (nc_sstat1);
5993 int phase = -1;
5994 int msg = -1;
5995 u32 jmp;
5996
5997 printk("%s: SCSI parity error detected: SCR1=%d DBC=%x SSTAT1=%x\n",
5998 ncr_name(np), hsts, dbc, sstat1);
5999
6000
6001
6002
6003
6004
6005 if (!(INB (nc_scntl1) & ISCON))
6006 return 0;
6007
6008
6009
6010
6011
6012 if (hsts & HS_INVALMASK)
6013 goto reset_all;
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023 if (!(dbc & 0xc0000000))
6024 phase = (dbc >> 24) & 7;
6025 if (phase == 7)
6026 msg = MSG_PARITY_ERROR;
6027 else
6028 msg = INITIATOR_ERROR;
6029
6030
6031
6032
6033
6034
6035
6036
6037 if (phase == 1)
6038 jmp = NCB_SCRIPTH_PHYS (np, par_err_data_in);
6039 else
6040 jmp = NCB_SCRIPTH_PHYS (np, par_err_other);
6041
6042 OUTONB (nc_ctest3, CLF );
6043 OUTB (nc_stest3, TE|CSF);
6044
6045 np->msgout[0] = msg;
6046 OUTL_DSP (jmp);
6047 return 1;
6048
6049 reset_all:
6050 ncr_start_reset(np);
6051 return 1;
6052 }
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068 static void ncr_int_ma (struct ncb *np)
6069 {
6070 u32 dbc;
6071 u32 rest;
6072 u32 dsp;
6073 u32 dsa;
6074 u32 nxtdsp;
6075 u32 newtmp;
6076 u32 *vdsp;
6077 u32 oadr, olen;
6078 u32 *tblp;
6079 ncrcmd *newcmd;
6080 u_char cmd, sbcl;
6081 struct ccb *cp;
6082
6083 dsp = INL (nc_dsp);
6084 dbc = INL (nc_dbc);
6085 sbcl = INB (nc_sbcl);
6086
6087 cmd = dbc >> 24;
6088 rest = dbc & 0xffffff;
6089
6090
6091
6092
6093
6094
6095 if ((cmd & 1) == 0) {
6096 u_char ctest5, ss0, ss2;
6097 u16 delta;
6098
6099 ctest5 = (np->rv_ctest5 & DFS) ? INB (nc_ctest5) : 0;
6100 if (ctest5 & DFS)
6101 delta=(((ctest5 << 8) | (INB (nc_dfifo) & 0xff)) - rest) & 0x3ff;
6102 else
6103 delta=(INB (nc_dfifo) - rest) & 0x7f;
6104
6105
6106
6107
6108
6109
6110
6111
6112 rest += delta;
6113 ss0 = INB (nc_sstat0);
6114 if (ss0 & OLF) rest++;
6115 if (ss0 & ORF) rest++;
6116 if (INB(nc_scntl3) & EWS) {
6117 ss2 = INB (nc_sstat2);
6118 if (ss2 & OLF1) rest++;
6119 if (ss2 & ORF1) rest++;
6120 }
6121
6122 if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_PHASE))
6123 printk ("P%x%x RL=%d D=%d SS0=%x ", cmd&7, sbcl&7,
6124 (unsigned) rest, (unsigned) delta, ss0);
6125
6126 } else {
6127 if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_PHASE))
6128 printk ("P%x%x RL=%d ", cmd&7, sbcl&7, rest);
6129 }
6130
6131
6132
6133
6134 OUTONB (nc_ctest3, CLF );
6135 OUTB (nc_stest3, TE|CSF);
6136
6137
6138
6139
6140
6141
6142 dsa = INL (nc_dsa);
6143 if (!(cmd & 6)) {
6144 cp = np->header.cp;
6145 if (CCB_PHYS(cp, phys) != dsa)
6146 cp = NULL;
6147 } else {
6148 cp = np->ccb;
6149 while (cp && (CCB_PHYS (cp, phys) != dsa))
6150 cp = cp->link_ccb;
6151 }
6152
6153
6154
6155
6156
6157 vdsp = NULL;
6158 nxtdsp = 0;
6159 if (dsp > np->p_script &&
6160 dsp <= np->p_script + sizeof(struct script)) {
6161 vdsp = (u32 *)((char*)np->script0 + (dsp-np->p_script-8));
6162 nxtdsp = dsp;
6163 }
6164 else if (dsp > np->p_scripth &&
6165 dsp <= np->p_scripth + sizeof(struct scripth)) {
6166 vdsp = (u32 *)((char*)np->scripth0 + (dsp-np->p_scripth-8));
6167 nxtdsp = dsp;
6168 }
6169 else if (cp) {
6170 if (dsp == CCB_PHYS (cp, patch[2])) {
6171 vdsp = &cp->patch[0];
6172 nxtdsp = scr_to_cpu(vdsp[3]);
6173 }
6174 else if (dsp == CCB_PHYS (cp, patch[6])) {
6175 vdsp = &cp->patch[4];
6176 nxtdsp = scr_to_cpu(vdsp[3]);
6177 }
6178 }
6179
6180
6181
6182
6183
6184 if (DEBUG_FLAGS & DEBUG_PHASE) {
6185 printk ("\nCP=%p CP2=%p DSP=%x NXT=%x VDSP=%p CMD=%x ",
6186 cp, np->header.cp,
6187 (unsigned)dsp,
6188 (unsigned)nxtdsp, vdsp, cmd);
6189 }
6190
6191
6192
6193
6194
6195
6196
6197 if (!cp) {
6198 printk ("%s: SCSI phase error fixup: "
6199 "CCB already dequeued (0x%08lx)\n",
6200 ncr_name (np), (u_long) np->header.cp);
6201 goto reset_all;
6202 }
6203
6204
6205
6206
6207
6208 oadr = scr_to_cpu(vdsp[1]);
6209
6210 if (cmd & 0x10) {
6211 tblp = (u32 *) ((char*) &cp->phys + oadr);
6212 olen = scr_to_cpu(tblp[0]);
6213 oadr = scr_to_cpu(tblp[1]);
6214 } else {
6215 tblp = (u32 *) 0;
6216 olen = scr_to_cpu(vdsp[0]) & 0xffffff;
6217 }
6218
6219 if (DEBUG_FLAGS & DEBUG_PHASE) {
6220 printk ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n",
6221 (unsigned) (scr_to_cpu(vdsp[0]) >> 24),
6222 tblp,
6223 (unsigned) olen,
6224 (unsigned) oadr);
6225 }
6226
6227
6228
6229
6230
6231 if (cmd != (scr_to_cpu(vdsp[0]) >> 24)) {
6232 PRINT_ADDR(cp->cmd, "internal error: cmd=%02x != %02x=(vdsp[0] "
6233 ">> 24)\n", cmd, scr_to_cpu(vdsp[0]) >> 24);
6234
6235 goto reset_all;
6236 }
6237
6238
6239
6240
6241
6242
6243
6244 if (cp != np->header.cp) {
6245 printk ("%s: SCSI phase error fixup: "
6246 "CCB address mismatch (0x%08lx != 0x%08lx)\n",
6247 ncr_name (np), (u_long) cp, (u_long) np->header.cp);
6248 }
6249
6250
6251
6252
6253
6254 if (cmd & 0x06) {
6255 PRINT_ADDR(cp->cmd, "phase change %x-%x %d@%08x resid=%d.\n",
6256 cmd&7, sbcl&7, (unsigned)olen,
6257 (unsigned)oadr, (unsigned)rest);
6258 goto unexpected_phase;
6259 }
6260
6261
6262
6263
6264
6265
6266 newcmd = cp->patch;
6267 newtmp = CCB_PHYS (cp, patch);
6268 if (newtmp == scr_to_cpu(cp->phys.header.savep)) {
6269 newcmd = &cp->patch[4];
6270 newtmp = CCB_PHYS (cp, patch[4]);
6271 }
6272
6273
6274
6275
6276
6277 newcmd[0] = cpu_to_scr(((cmd & 0x0f) << 24) | rest);
6278 newcmd[1] = cpu_to_scr(oadr + olen - rest);
6279 newcmd[2] = cpu_to_scr(SCR_JUMP);
6280 newcmd[3] = cpu_to_scr(nxtdsp);
6281
6282 if (DEBUG_FLAGS & DEBUG_PHASE) {
6283 PRINT_ADDR(cp->cmd, "newcmd[%d] %x %x %x %x.\n",
6284 (int) (newcmd - cp->patch),
6285 (unsigned)scr_to_cpu(newcmd[0]),
6286 (unsigned)scr_to_cpu(newcmd[1]),
6287 (unsigned)scr_to_cpu(newcmd[2]),
6288 (unsigned)scr_to_cpu(newcmd[3]));
6289 }
6290
6291
6292
6293
6294 OUTL (nc_temp, newtmp);
6295 OUTL_DSP (NCB_SCRIPT_PHYS (np, dispatch));
6296 return;
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325 unexpected_phase:
6326 dsp -= 8;
6327 nxtdsp = 0;
6328
6329 switch (cmd & 7) {
6330 case 2:
6331 nxtdsp = NCB_SCRIPT_PHYS (np, dispatch);
6332 break;
6333 #if 0
6334 case 3:
6335 nxtdsp = NCB_SCRIPT_PHYS (np, dispatch);
6336 break;
6337 #endif
6338 case 6:
6339 np->scripth->nxtdsp_go_on[0] = cpu_to_scr(dsp + 8);
6340 if (dsp == NCB_SCRIPT_PHYS (np, send_ident)) {
6341 cp->host_status = HS_BUSY;
6342 nxtdsp = NCB_SCRIPTH_PHYS (np, clratn_go_on);
6343 }
6344 else if (dsp == NCB_SCRIPTH_PHYS (np, send_wdtr) ||
6345 dsp == NCB_SCRIPTH_PHYS (np, send_sdtr)) {
6346 nxtdsp = NCB_SCRIPTH_PHYS (np, nego_bad_phase);
6347 }
6348 break;
6349 #if 0
6350 case 7:
6351 nxtdsp = NCB_SCRIPT_PHYS (np, clrack);
6352 break;
6353 #endif
6354 }
6355
6356 if (nxtdsp) {
6357 OUTL_DSP (nxtdsp);
6358 return;
6359 }
6360
6361 reset_all:
6362 ncr_start_reset(np);
6363 }
6364
6365
6366 static void ncr_sir_to_redo(struct ncb *np, int num, struct ccb *cp)
6367 {
6368 struct scsi_cmnd *cmd = cp->cmd;
6369 struct tcb *tp = &np->target[cmd->device->id];
6370 struct lcb *lp = tp->lp[cmd->device->lun];
6371 struct list_head *qp;
6372 struct ccb * cp2;
6373 int disc_cnt = 0;
6374 int busy_cnt = 0;
6375 u32 startp;
6376 u_char s_status = INB (SS_PRT);
6377
6378
6379
6380
6381
6382
6383
6384 if (lp) {
6385 qp = lp->busy_ccbq.prev;
6386 while (qp != &lp->busy_ccbq) {
6387 cp2 = list_entry(qp, struct ccb, link_ccbq);
6388 qp = qp->prev;
6389 ++busy_cnt;
6390 if (cp2 == cp)
6391 break;
6392 cp2->start.schedule.l_paddr =
6393 cpu_to_scr(NCB_SCRIPTH_PHYS (np, skip));
6394 }
6395 lp->held_ccb = cp;
6396 disc_cnt = lp->queuedccbs - busy_cnt;
6397 }
6398
6399 switch(s_status) {
6400 default:
6401 case SAM_STAT_TASK_SET_FULL:
6402
6403
6404
6405
6406 if (!lp)
6407 goto out;
6408 if (bootverbose >= 1) {
6409 PRINT_ADDR(cmd, "QUEUE FULL! %d busy, %d disconnected "
6410 "CCBs\n", busy_cnt, disc_cnt);
6411 }
6412 if (disc_cnt < lp->numtags) {
6413 lp->numtags = disc_cnt > 2 ? disc_cnt : 2;
6414 lp->num_good = 0;
6415 ncr_setup_tags (np, cmd->device);
6416 }
6417
6418
6419
6420
6421
6422
6423 cp->phys.header.savep = cp->startp;
6424 cp->host_status = HS_BUSY;
6425 cp->scsi_status = SAM_STAT_ILLEGAL;
6426
6427 ncr_put_start_queue(np, cp);
6428 if (disc_cnt)
6429 INB (nc_ctest2);
6430 OUTL_DSP (NCB_SCRIPT_PHYS (np, reselect));
6431 return;
6432 case SAM_STAT_COMMAND_TERMINATED:
6433 case SAM_STAT_CHECK_CONDITION:
6434
6435
6436
6437 if (cp->auto_sense)
6438 goto out;
6439
6440
6441
6442
6443
6444
6445
6446
6447 cp->scsi_smsg2[0] = IDENTIFY(0, cmd->device->lun);
6448 cp->phys.smsg.addr = cpu_to_scr(CCB_PHYS (cp, scsi_smsg2));
6449 cp->phys.smsg.size = cpu_to_scr(1);
6450
6451
6452
6453
6454 cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, sensecmd));
6455 cp->phys.cmd.size = cpu_to_scr(6);
6456
6457
6458
6459
6460 cp->sensecmd[0] = 0x03;
6461 cp->sensecmd[1] = (cmd->device->lun & 0x7) << 5;
6462 cp->sensecmd[4] = sizeof(cp->sense_buf);
6463
6464
6465
6466
6467 memset(cp->sense_buf, 0, sizeof(cp->sense_buf));
6468 cp->phys.sense.addr = cpu_to_scr(CCB_PHYS(cp,sense_buf[0]));
6469 cp->phys.sense.size = cpu_to_scr(sizeof(cp->sense_buf));
6470
6471
6472
6473
6474 startp = cpu_to_scr(NCB_SCRIPTH_PHYS (np, sdata_in));
6475
6476 cp->phys.header.savep = startp;
6477 cp->phys.header.goalp = startp + 24;
6478 cp->phys.header.lastp = startp;
6479 cp->phys.header.wgoalp = startp + 24;
6480 cp->phys.header.wlastp = startp;
6481
6482 cp->host_status = HS_BUSY;
6483 cp->scsi_status = SAM_STAT_ILLEGAL;
6484 cp->auto_sense = s_status;
6485
6486 cp->start.schedule.l_paddr =
6487 cpu_to_scr(NCB_SCRIPT_PHYS (np, select));
6488
6489
6490
6491
6492 if (cmd->device->select_no_atn)
6493 cp->start.schedule.l_paddr =
6494 cpu_to_scr(NCB_SCRIPTH_PHYS (np, select_no_atn));
6495
6496 ncr_put_start_queue(np, cp);
6497
6498 OUTL_DSP (NCB_SCRIPT_PHYS (np, start));
6499 return;
6500 }
6501
6502 out:
6503 OUTONB_STD ();
6504 return;
6505 }
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517 void ncr_int_sir (struct ncb *np)
6518 {
6519 u_char scntl3;
6520 u_char chg, ofs, per, fak, wide;
6521 u_char num = INB (nc_dsps);
6522 struct ccb *cp=NULL;
6523 u_long dsa = INL (nc_dsa);
6524 u_char target = INB (nc_sdid) & 0x0f;
6525 struct tcb *tp = &np->target[target];
6526 struct scsi_target *starget = tp->starget;
6527
6528 if (DEBUG_FLAGS & DEBUG_TINY) printk ("I#%d", num);
6529
6530 switch (num) {
6531 case SIR_INTFLY:
6532
6533
6534
6535
6536 ncr_wakeup_done(np);
6537 #ifdef SCSI_NCR_CCB_DONE_SUPPORT
6538 OUTL(nc_dsp, NCB_SCRIPT_PHYS (np, done_end) + 8);
6539 #else
6540 OUTL(nc_dsp, NCB_SCRIPT_PHYS (np, start));
6541 #endif
6542 return;
6543 case SIR_RESEL_NO_MSG_IN:
6544 case SIR_RESEL_NO_IDENTIFY:
6545
6546
6547
6548
6549
6550 if (tp->lp[0]) {
6551 OUTL_DSP (scr_to_cpu(tp->lp[0]->jump_ccb[0]));
6552 return;
6553 }
6554 fallthrough;
6555 case SIR_RESEL_BAD_TARGET:
6556 case SIR_RESEL_BAD_LUN:
6557 case SIR_RESEL_BAD_I_T_L_Q:
6558 case SIR_RESEL_BAD_I_T_L:
6559 printk ("%s:%d: SIR %d, "
6560 "incorrect nexus identification on reselection\n",
6561 ncr_name (np), target, num);
6562 goto out;
6563 case SIR_DONE_OVERFLOW:
6564 printk ("%s:%d: SIR %d, "
6565 "CCB done queue overflow\n",
6566 ncr_name (np), target, num);
6567 goto out;
6568 case SIR_BAD_STATUS:
6569 cp = np->header.cp;
6570 if (!cp || CCB_PHYS (cp, phys) != dsa)
6571 goto out;
6572 ncr_sir_to_redo(np, num, cp);
6573 return;
6574 default:
6575
6576
6577
6578 cp = np->ccb;
6579 while (cp && (CCB_PHYS (cp, phys) != dsa))
6580 cp = cp->link_ccb;
6581
6582 BUG_ON(!cp);
6583 BUG_ON(cp != np->header.cp);
6584
6585 if (!cp || cp != np->header.cp)
6586 goto out;
6587 }
6588
6589 switch (num) {
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649 case SIR_NEGO_FAILED:
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660 OUTB (HS_PRT, HS_BUSY);
6661
6662 fallthrough;
6663
6664 case SIR_NEGO_PROTO:
6665
6666
6667
6668
6669
6670
6671
6672
6673 if (DEBUG_FLAGS & DEBUG_NEGO) {
6674 PRINT_ADDR(cp->cmd, "negotiation failed sir=%x "
6675 "status=%x.\n", num, cp->nego_status);
6676 }
6677
6678
6679
6680
6681
6682 switch (cp->nego_status) {
6683
6684 case NS_SYNC:
6685 spi_period(starget) = 0;
6686 spi_offset(starget) = 0;
6687 ncr_setsync (np, cp, 0, 0xe0);
6688 break;
6689
6690 case NS_WIDE:
6691 spi_width(starget) = 0;
6692 ncr_setwide (np, cp, 0, 0);
6693 break;
6694
6695 }
6696 np->msgin [0] = NOP;
6697 np->msgout[0] = NOP;
6698 cp->nego_status = 0;
6699 break;
6700
6701 case SIR_NEGO_SYNC:
6702 if (DEBUG_FLAGS & DEBUG_NEGO) {
6703 ncr_print_msg(cp, "sync msgin", np->msgin);
6704 }
6705
6706 chg = 0;
6707 per = np->msgin[3];
6708 ofs = np->msgin[4];
6709 if (ofs==0) per=255;
6710
6711
6712
6713
6714
6715
6716 if (ofs && starget)
6717 spi_support_sync(starget) = 1;
6718
6719
6720
6721
6722
6723 if (per < np->minsync)
6724 {chg = 1; per = np->minsync;}
6725 if (per < tp->minsync)
6726 {chg = 1; per = tp->minsync;}
6727 if (ofs > tp->maxoffs)
6728 {chg = 1; ofs = tp->maxoffs;}
6729
6730
6731
6732
6733 fak = 7;
6734 scntl3 = 0;
6735 if (ofs != 0) {
6736 ncr_getsync(np, per, &fak, &scntl3);
6737 if (fak > 7) {
6738 chg = 1;
6739 ofs = 0;
6740 }
6741 }
6742 if (ofs == 0) {
6743 fak = 7;
6744 per = 0;
6745 scntl3 = 0;
6746 tp->minsync = 0;
6747 }
6748
6749 if (DEBUG_FLAGS & DEBUG_NEGO) {
6750 PRINT_ADDR(cp->cmd, "sync: per=%d scntl3=0x%x ofs=%d "
6751 "fak=%d chg=%d.\n", per, scntl3, ofs, fak, chg);
6752 }
6753
6754 if (INB (HS_PRT) == HS_NEGOTIATE) {
6755 OUTB (HS_PRT, HS_BUSY);
6756 switch (cp->nego_status) {
6757
6758 case NS_SYNC:
6759
6760 if (chg) {
6761
6762 spi_period(starget) = 0;
6763 spi_offset(starget) = 0;
6764 ncr_setsync(np, cp, 0, 0xe0);
6765 OUTL_DSP(NCB_SCRIPT_PHYS (np, msg_bad));
6766 } else {
6767
6768 spi_period(starget) = per;
6769 spi_offset(starget) = ofs;
6770 ncr_setsync(np, cp, scntl3, (fak<<5)|ofs);
6771 OUTL_DSP(NCB_SCRIPT_PHYS (np, clrack));
6772 }
6773 return;
6774
6775 case NS_WIDE:
6776 spi_width(starget) = 0;
6777 ncr_setwide(np, cp, 0, 0);
6778 break;
6779 }
6780 }
6781
6782
6783
6784
6785
6786
6787 spi_period(starget) = per;
6788 spi_offset(starget) = ofs;
6789 ncr_setsync(np, cp, scntl3, (fak<<5)|ofs);
6790
6791 spi_populate_sync_msg(np->msgout, per, ofs);
6792 cp->nego_status = NS_SYNC;
6793
6794 if (DEBUG_FLAGS & DEBUG_NEGO) {
6795 ncr_print_msg(cp, "sync msgout", np->msgout);
6796 }
6797
6798 if (!ofs) {
6799 OUTL_DSP (NCB_SCRIPT_PHYS (np, msg_bad));
6800 return;
6801 }
6802 np->msgin [0] = NOP;
6803
6804 break;
6805
6806 case SIR_NEGO_WIDE:
6807
6808
6809
6810 if (DEBUG_FLAGS & DEBUG_NEGO) {
6811 ncr_print_msg(cp, "wide msgin", np->msgin);
6812 }
6813
6814
6815
6816
6817
6818 chg = 0;
6819 wide = np->msgin[3];
6820
6821
6822
6823
6824
6825
6826 if (wide && starget)
6827 spi_support_wide(starget) = 1;
6828
6829
6830
6831
6832
6833 if (wide > tp->usrwide)
6834 {chg = 1; wide = tp->usrwide;}
6835
6836 if (DEBUG_FLAGS & DEBUG_NEGO) {
6837 PRINT_ADDR(cp->cmd, "wide: wide=%d chg=%d.\n", wide,
6838 chg);
6839 }
6840
6841 if (INB (HS_PRT) == HS_NEGOTIATE) {
6842 OUTB (HS_PRT, HS_BUSY);
6843 switch (cp->nego_status) {
6844
6845 case NS_WIDE:
6846
6847
6848
6849 if (chg) {
6850
6851 spi_width(starget) = 0;
6852 ncr_setwide(np, cp, 0, 1);
6853 OUTL_DSP (NCB_SCRIPT_PHYS (np, msg_bad));
6854 } else {
6855
6856 spi_width(starget) = wide;
6857 ncr_setwide(np, cp, wide, 1);
6858 OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
6859 }
6860 return;
6861
6862 case NS_SYNC:
6863 spi_period(starget) = 0;
6864 spi_offset(starget) = 0;
6865 ncr_setsync(np, cp, 0, 0xe0);
6866 break;
6867 }
6868 }
6869
6870
6871
6872
6873
6874
6875 spi_width(starget) = wide;
6876 ncr_setwide(np, cp, wide, 1);
6877 spi_populate_width_msg(np->msgout, wide);
6878
6879 np->msgin [0] = NOP;
6880
6881 cp->nego_status = NS_WIDE;
6882
6883 if (DEBUG_FLAGS & DEBUG_NEGO) {
6884 ncr_print_msg(cp, "wide msgout", np->msgin);
6885 }
6886 break;
6887
6888
6889
6890
6891
6892
6893
6894
6895 case SIR_REJECT_RECEIVED:
6896
6897
6898
6899
6900
6901
6902
6903 PRINT_ADDR(cp->cmd, "MESSAGE_REJECT received (%x:%x).\n",
6904 (unsigned)scr_to_cpu(np->lastmsg), np->msgout[0]);
6905 break;
6906
6907 case SIR_REJECT_SENT:
6908
6909
6910
6911
6912
6913
6914
6915 ncr_print_msg(cp, "MESSAGE_REJECT sent for", np->msgin);
6916 break;
6917
6918
6919
6920
6921
6922
6923
6924
6925 case SIR_IGN_RESIDUE:
6926
6927
6928
6929
6930
6931
6932
6933
6934 PRINT_ADDR(cp->cmd, "IGNORE_WIDE_RESIDUE received, but not yet "
6935 "implemented.\n");
6936 break;
6937 #if 0
6938 case SIR_MISSING_SAVE:
6939
6940
6941
6942
6943
6944
6945
6946
6947 PRINT_ADDR(cp->cmd, "DISCONNECT received, but datapointer "
6948 "not saved: data=%x save=%x goal=%x.\n",
6949 (unsigned) INL (nc_temp),
6950 (unsigned) scr_to_cpu(np->header.savep),
6951 (unsigned) scr_to_cpu(np->header.goalp));
6952 break;
6953 #endif
6954 }
6955
6956 out:
6957 OUTONB_STD ();
6958 }
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969 static struct ccb *ncr_get_ccb(struct ncb *np, struct scsi_cmnd *cmd)
6970 {
6971 u_char tn = cmd->device->id;
6972 u_char ln = cmd->device->lun;
6973 struct tcb *tp = &np->target[tn];
6974 struct lcb *lp = tp->lp[ln];
6975 u_char tag = NO_TAG;
6976 struct ccb *cp = NULL;
6977
6978
6979
6980
6981 if (lp) {
6982 struct list_head *qp;
6983
6984
6985
6986 if (lp->usetags && lp->busyccbs >= lp->maxnxs)
6987 return NULL;
6988
6989
6990
6991
6992 if (list_empty(&lp->free_ccbq))
6993 ncr_alloc_ccb(np, tn, ln);
6994
6995
6996
6997
6998 qp = ncr_list_pop(&lp->free_ccbq);
6999 if (qp) {
7000 cp = list_entry(qp, struct ccb, link_ccbq);
7001 if (cp->magic) {
7002 PRINT_ADDR(cmd, "ccb free list corrupted "
7003 "(@%p)\n", cp);
7004 cp = NULL;
7005 } else {
7006 list_add_tail(qp, &lp->wait_ccbq);
7007 ++lp->busyccbs;
7008 }
7009 }
7010
7011
7012
7013
7014
7015 if (cp) {
7016 if (lp->usetags)
7017 tag = lp->cb_tags[lp->ia_tag];
7018 }
7019 else if (lp->actccbs > 0)
7020 return NULL;
7021 }
7022
7023
7024
7025
7026 if (!cp)
7027 cp = np->ccb;
7028
7029
7030
7031
7032 #if 0
7033 while (cp->magic) {
7034 if (flags & SCSI_NOSLEEP) break;
7035 if (tsleep ((caddr_t)cp, PRIBIO|PCATCH, "ncr", 0))
7036 break;
7037 }
7038 #endif
7039
7040 if (cp->magic)
7041 return NULL;
7042
7043 cp->magic = 1;
7044
7045
7046
7047
7048 if (lp) {
7049 if (tag != NO_TAG) {
7050 ++lp->ia_tag;
7051 if (lp->ia_tag == MAX_TAGS)
7052 lp->ia_tag = 0;
7053 lp->tags_umap |= (((tagmap_t) 1) << tag);
7054 }
7055 }
7056
7057
7058
7059
7060 cp->tag = tag;
7061 cp->target = tn;
7062 cp->lun = ln;
7063
7064 if (DEBUG_FLAGS & DEBUG_TAGS) {
7065 PRINT_ADDR(cmd, "ccb @%p using tag %d.\n", cp, tag);
7066 }
7067
7068 return cp;
7069 }
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080 static void ncr_free_ccb (struct ncb *np, struct ccb *cp)
7081 {
7082 struct tcb *tp = &np->target[cp->target];
7083 struct lcb *lp = tp->lp[cp->lun];
7084
7085 if (DEBUG_FLAGS & DEBUG_TAGS) {
7086 PRINT_ADDR(cp->cmd, "ccb @%p freeing tag %d.\n", cp, cp->tag);
7087 }
7088
7089
7090
7091
7092
7093
7094 if (lp) {
7095 if (cp->tag != NO_TAG) {
7096 lp->cb_tags[lp->if_tag++] = cp->tag;
7097 if (lp->if_tag == MAX_TAGS)
7098 lp->if_tag = 0;
7099 lp->tags_umap &= ~(((tagmap_t) 1) << cp->tag);
7100 lp->tags_smap &= lp->tags_umap;
7101 lp->jump_ccb[cp->tag] =
7102 cpu_to_scr(NCB_SCRIPTH_PHYS(np, bad_i_t_l_q));
7103 } else {
7104 lp->jump_ccb[0] =
7105 cpu_to_scr(NCB_SCRIPTH_PHYS(np, bad_i_t_l));
7106 }
7107 }
7108
7109
7110
7111
7112
7113 if (lp) {
7114 if (cp != np->ccb)
7115 list_move(&cp->link_ccbq, &lp->free_ccbq);
7116 --lp->busyccbs;
7117 if (cp->queued) {
7118 --lp->queuedccbs;
7119 }
7120 }
7121 cp -> host_status = HS_IDLE;
7122 cp -> magic = 0;
7123 if (cp->queued) {
7124 --np->queuedccbs;
7125 cp->queued = 0;
7126 }
7127
7128 #if 0
7129 if (cp == np->ccb)
7130 wakeup ((caddr_t) cp);
7131 #endif
7132 }
7133
7134
7135 #define ncr_reg_bus_addr(r) (np->paddr + offsetof (struct ncr_reg, r))
7136
7137
7138
7139
7140
7141
7142 static void ncr_init_ccb(struct ncb *np, struct ccb *cp)
7143 {
7144 ncrcmd copy_4 = np->features & FE_PFEN ? SCR_COPY(4) : SCR_COPY_F(4);
7145
7146
7147
7148
7149 cp->p_ccb = vtobus(cp);
7150 cp->phys.header.cp = cp;
7151
7152
7153
7154
7155 INIT_LIST_HEAD(&cp->link_ccbq);
7156
7157
7158
7159
7160
7161
7162
7163 cp->start.setup_dsa[0] = cpu_to_scr(copy_4);
7164 cp->start.setup_dsa[1] = cpu_to_scr(CCB_PHYS(cp, start.p_phys));
7165 cp->start.setup_dsa[2] = cpu_to_scr(ncr_reg_bus_addr(nc_dsa));
7166 cp->start.schedule.l_cmd = cpu_to_scr(SCR_JUMP);
7167 cp->start.p_phys = cpu_to_scr(CCB_PHYS(cp, phys));
7168
7169 memcpy(&cp->restart, &cp->start, sizeof(cp->restart));
7170
7171 cp->start.schedule.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
7172 cp->restart.schedule.l_paddr = cpu_to_scr(NCB_SCRIPTH_PHYS (np, abort));
7173 }
7174
7175
7176
7177
7178
7179
7180
7181 static void ncr_alloc_ccb(struct ncb *np, u_char tn, u_char ln)
7182 {
7183 struct tcb *tp = &np->target[tn];
7184 struct lcb *lp = tp->lp[ln];
7185 struct ccb *cp = NULL;
7186
7187
7188
7189
7190 cp = m_calloc_dma(sizeof(struct ccb), "CCB");
7191 if (!cp)
7192 return;
7193
7194
7195
7196
7197 lp->actccbs++;
7198 np->actccbs++;
7199 memset(cp, 0, sizeof (*cp));
7200 ncr_init_ccb(np, cp);
7201
7202
7203
7204
7205
7206 cp->link_ccb = np->ccb->link_ccb;
7207 np->ccb->link_ccb = cp;
7208
7209 list_add(&cp->link_ccbq, &lp->free_ccbq);
7210 }
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230 static void ncr_init_tcb (struct ncb *np, u_char tn)
7231 {
7232 struct tcb *tp = &np->target[tn];
7233 ncrcmd copy_1 = np->features & FE_PFEN ? SCR_COPY(1) : SCR_COPY_F(1);
7234 int th = tn & 3;
7235 int i;
7236
7237
7238
7239
7240
7241 tp->jump_tcb.l_cmd =
7242 cpu_to_scr((SCR_JUMP ^ IFFALSE (DATA (0x80 + tn))));
7243 tp->jump_tcb.l_paddr = np->jump_tcb[th].l_paddr;
7244
7245
7246
7247
7248
7249 tp->getscr[0] = cpu_to_scr(copy_1);
7250 tp->getscr[1] = cpu_to_scr(vtobus (&tp->sval));
7251 #ifdef SCSI_NCR_BIG_ENDIAN
7252 tp->getscr[2] = cpu_to_scr(ncr_reg_bus_addr(nc_sxfer) ^ 3);
7253 #else
7254 tp->getscr[2] = cpu_to_scr(ncr_reg_bus_addr(nc_sxfer));
7255 #endif
7256
7257
7258
7259
7260
7261 tp->getscr[3] = cpu_to_scr(copy_1);
7262 tp->getscr[4] = cpu_to_scr(vtobus (&tp->wval));
7263 #ifdef SCSI_NCR_BIG_ENDIAN
7264 tp->getscr[5] = cpu_to_scr(ncr_reg_bus_addr(nc_scntl3) ^ 3);
7265 #else
7266 tp->getscr[5] = cpu_to_scr(ncr_reg_bus_addr(nc_scntl3));
7267 #endif
7268
7269
7270
7271
7272
7273 tp->call_lun.l_cmd = cpu_to_scr(SCR_CALL);
7274 tp->call_lun.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, resel_lun));
7275
7276
7277
7278
7279
7280
7281 for (i = 0 ; i < 4 ; i++) {
7282 tp->jump_lcb[i].l_cmd =
7283 cpu_to_scr((SCR_JUMP ^ IFTRUE (MASK (i, 3))));
7284 tp->jump_lcb[i].l_paddr =
7285 cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_identify));
7286 }
7287
7288
7289
7290
7291 np->jump_tcb[th].l_paddr = cpu_to_scr(vtobus (&tp->jump_tcb));
7292
7293
7294
7295
7296 #ifdef SCSI_NCR_BIG_ENDIAN
7297 BUG_ON(((offsetof(struct ncr_reg, nc_sxfer) ^
7298 offsetof(struct tcb , sval )) &3) != 3);
7299 BUG_ON(((offsetof(struct ncr_reg, nc_scntl3) ^
7300 offsetof(struct tcb , wval )) &3) != 3);
7301 #else
7302 BUG_ON(((offsetof(struct ncr_reg, nc_sxfer) ^
7303 offsetof(struct tcb , sval )) &3) != 0);
7304 BUG_ON(((offsetof(struct ncr_reg, nc_scntl3) ^
7305 offsetof(struct tcb , wval )) &3) != 0);
7306 #endif
7307 }
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317 static struct lcb *ncr_alloc_lcb (struct ncb *np, u_char tn, u_char ln)
7318 {
7319 struct tcb *tp = &np->target[tn];
7320 struct lcb *lp = tp->lp[ln];
7321 ncrcmd copy_4 = np->features & FE_PFEN ? SCR_COPY(4) : SCR_COPY_F(4);
7322 int lh = ln & 3;
7323
7324
7325
7326
7327 if (lp)
7328 return lp;
7329
7330
7331
7332
7333 lp = m_calloc_dma(sizeof(struct lcb), "LCB");
7334 if (!lp)
7335 goto fail;
7336 memset(lp, 0, sizeof(*lp));
7337 tp->lp[ln] = lp;
7338
7339
7340
7341
7342 if (!tp->jump_tcb.l_cmd)
7343 ncr_init_tcb(np, tn);
7344
7345
7346
7347
7348 INIT_LIST_HEAD(&lp->free_ccbq);
7349 INIT_LIST_HEAD(&lp->busy_ccbq);
7350 INIT_LIST_HEAD(&lp->wait_ccbq);
7351 INIT_LIST_HEAD(&lp->skip_ccbq);
7352
7353
7354
7355
7356
7357 lp->maxnxs = 1;
7358 lp->jump_ccb = &lp->jump_ccb_0;
7359 lp->p_jump_ccb = cpu_to_scr(vtobus(lp->jump_ccb));
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372 lp->jump_lcb.l_cmd =
7373 cpu_to_scr((SCR_JUMP ^ IFFALSE (MASK (0x80+ln, 0xff))));
7374 lp->jump_lcb.l_paddr = tp->jump_lcb[lh].l_paddr;
7375
7376 lp->load_jump_ccb[0] = cpu_to_scr(copy_4);
7377 lp->load_jump_ccb[1] = cpu_to_scr(vtobus (&lp->p_jump_ccb));
7378 lp->load_jump_ccb[2] = cpu_to_scr(ncr_reg_bus_addr(nc_temp));
7379
7380 lp->jump_tag.l_cmd = cpu_to_scr(SCR_JUMP);
7381 lp->jump_tag.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, resel_notag));
7382
7383
7384
7385
7386 tp->jump_lcb[lh].l_paddr = cpu_to_scr(vtobus (&lp->jump_lcb));
7387
7388
7389
7390
7391 lp->busyccbs = 1;
7392 lp->queuedccbs = 1;
7393 lp->queuedepth = 1;
7394 fail:
7395 return lp;
7396 }
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407 static struct lcb *ncr_setup_lcb (struct ncb *np, struct scsi_device *sdev)
7408 {
7409 unsigned char tn = sdev->id, ln = sdev->lun;
7410 struct tcb *tp = &np->target[tn];
7411 struct lcb *lp = tp->lp[ln];
7412
7413
7414 if (!lp && !(lp = ncr_alloc_lcb(np, tn, ln)))
7415 goto fail;
7416
7417
7418
7419
7420
7421 if (sdev->tagged_supported && lp->jump_ccb == &lp->jump_ccb_0) {
7422 int i;
7423 lp->jump_ccb = m_calloc_dma(256, "JUMP_CCB");
7424 if (!lp->jump_ccb) {
7425 lp->jump_ccb = &lp->jump_ccb_0;
7426 goto fail;
7427 }
7428 lp->p_jump_ccb = cpu_to_scr(vtobus(lp->jump_ccb));
7429 for (i = 0 ; i < 64 ; i++)
7430 lp->jump_ccb[i] =
7431 cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l_q));
7432 for (i = 0 ; i < MAX_TAGS ; i++)
7433 lp->cb_tags[i] = i;
7434 lp->maxnxs = MAX_TAGS;
7435 lp->tags_stime = jiffies + 3*HZ;
7436 ncr_setup_tags (np, sdev);
7437 }
7438
7439
7440 fail:
7441 return lp;
7442 }
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473 static int ncr_scatter(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd)
7474 {
7475 int segment = 0;
7476 int use_sg = scsi_sg_count(cmd);
7477
7478 cp->data_len = 0;
7479
7480 use_sg = map_scsi_sg_data(np, cmd);
7481 if (use_sg > 0) {
7482 struct scatterlist *sg;
7483 struct scr_tblmove *data;
7484
7485 if (use_sg > MAX_SCATTER) {
7486 unmap_scsi_data(np, cmd);
7487 return -1;
7488 }
7489
7490 data = &cp->phys.data[MAX_SCATTER - use_sg];
7491
7492 scsi_for_each_sg(cmd, sg, use_sg, segment) {
7493 dma_addr_t baddr = sg_dma_address(sg);
7494 unsigned int len = sg_dma_len(sg);
7495
7496 ncr_build_sge(np, &data[segment], baddr, len);
7497 cp->data_len += len;
7498 }
7499 } else
7500 segment = -2;
7501
7502 return segment;
7503 }
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516 static int __init ncr_regtest (struct ncb* np)
7517 {
7518 register volatile u32 data;
7519
7520
7521
7522
7523
7524 data = 0xffffffff;
7525 OUTL_OFF(offsetof(struct ncr_reg, nc_dstat), data);
7526 data = INL_OFF(offsetof(struct ncr_reg, nc_dstat));
7527 #if 1
7528 if (data == 0xffffffff) {
7529 #else
7530 if ((data & 0xe2f0fffd) != 0x02000080) {
7531 #endif
7532 printk ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n",
7533 (unsigned) data);
7534 return (0x10);
7535 }
7536 return (0);
7537 }
7538
7539 static int __init ncr_snooptest (struct ncb* np)
7540 {
7541 u32 ncr_rd, ncr_wr, ncr_bk, host_rd, host_wr, pc;
7542 int i, err=0;
7543 if (np->reg) {
7544 err |= ncr_regtest (np);
7545 if (err)
7546 return (err);
7547 }
7548
7549
7550 pc = NCB_SCRIPTH_PHYS (np, snooptest);
7551 host_wr = 1;
7552 ncr_wr = 2;
7553
7554
7555
7556 np->ncr_cache = cpu_to_scr(host_wr);
7557 OUTL (nc_temp, ncr_wr);
7558
7559
7560
7561 OUTL_DSP (pc);
7562
7563
7564
7565 for (i=0; i<NCR_SNOOP_TIMEOUT; i++)
7566 if (INB(nc_istat) & (INTF|SIP|DIP))
7567 break;
7568
7569
7570
7571 pc = INL (nc_dsp);
7572
7573
7574
7575 host_rd = scr_to_cpu(np->ncr_cache);
7576 ncr_rd = INL (nc_scratcha);
7577 ncr_bk = INL (nc_temp);
7578
7579
7580
7581 ncr_chip_reset(np, 100);
7582
7583
7584
7585 if (i>=NCR_SNOOP_TIMEOUT) {
7586 printk ("CACHE TEST FAILED: timeout.\n");
7587 return (0x20);
7588 }
7589
7590
7591
7592 if (pc != NCB_SCRIPTH_PHYS (np, snoopend)+8) {
7593 printk ("CACHE TEST FAILED: script execution failed.\n");
7594 printk ("start=%08lx, pc=%08lx, end=%08lx\n",
7595 (u_long) NCB_SCRIPTH_PHYS (np, snooptest), (u_long) pc,
7596 (u_long) NCB_SCRIPTH_PHYS (np, snoopend) +8);
7597 return (0x40);
7598 }
7599
7600
7601
7602 if (host_wr != ncr_rd) {
7603 printk ("CACHE TEST FAILED: host wrote %d, ncr read %d.\n",
7604 (int) host_wr, (int) ncr_rd);
7605 err |= 1;
7606 }
7607 if (host_rd != ncr_wr) {
7608 printk ("CACHE TEST FAILED: ncr wrote %d, host read %d.\n",
7609 (int) ncr_wr, (int) host_rd);
7610 err |= 2;
7611 }
7612 if (ncr_bk != ncr_wr) {
7613 printk ("CACHE TEST FAILED: ncr wrote %d, read back %d.\n",
7614 (int) ncr_wr, (int) ncr_bk);
7615 err |= 4;
7616 }
7617 return (err);
7618 }
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646 static void ncr_selectclock(struct ncb *np, u_char scntl3)
7647 {
7648 if (np->multiplier < 2) {
7649 OUTB(nc_scntl3, scntl3);
7650 return;
7651 }
7652
7653 if (bootverbose >= 2)
7654 printk ("%s: enabling clock multiplier\n", ncr_name(np));
7655
7656 OUTB(nc_stest1, DBLEN);
7657 if (np->multiplier > 2) {
7658 int i = 20;
7659 while (!(INB(nc_stest4) & LCKFRQ) && --i > 0)
7660 udelay(20);
7661 if (!i)
7662 printk("%s: the chip cannot lock the frequency\n", ncr_name(np));
7663 } else
7664 udelay(20);
7665 OUTB(nc_stest3, HSC);
7666 OUTB(nc_scntl3, scntl3);
7667 OUTB(nc_stest1, (DBLEN|DBLSEL));
7668 OUTB(nc_stest3, 0x00);
7669 }
7670
7671
7672
7673
7674
7675 static unsigned __init ncrgetfreq (struct ncb *np, int gen)
7676 {
7677 unsigned ms = 0;
7678 char count = 0;
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695 OUTB (nc_stest1, 0);
7696 OUTW (nc_sien , 0);
7697 (void) INW (nc_sist);
7698 OUTB (nc_dien , 0);
7699 (void) INW (nc_sist);
7700 OUTB (nc_scntl3, 4);
7701 OUTB (nc_stime1, 0);
7702 OUTB (nc_stime1, gen);
7703 while (!(INW(nc_sist) & GEN) && ms++ < 100000) {
7704 for (count = 0; count < 10; count ++)
7705 udelay(100);
7706 }
7707 OUTB (nc_stime1, 0);
7708
7709
7710
7711
7712
7713 OUTB (nc_scntl3, 0);
7714
7715 if (bootverbose >= 2)
7716 printk ("%s: Delay (GEN=%d): %u msec\n", ncr_name(np), gen, ms);
7717
7718
7719
7720 return ms ? ((1 << gen) * 4340) / ms : 0;
7721 }
7722
7723
7724
7725
7726 static void __init ncr_getclock (struct ncb *np, int mult)
7727 {
7728 unsigned char scntl3 = INB(nc_scntl3);
7729 unsigned char stest1 = INB(nc_stest1);
7730 unsigned f1;
7731
7732 np->multiplier = 1;
7733 f1 = 40000;
7734
7735
7736
7737
7738 if (mult > 1 && (stest1 & (DBLEN+DBLSEL)) == DBLEN+DBLSEL) {
7739 if (bootverbose >= 2)
7740 printk ("%s: clock multiplier found\n", ncr_name(np));
7741 np->multiplier = mult;
7742 }
7743
7744
7745
7746
7747
7748
7749 if (np->multiplier != mult || (scntl3 & 7) < 3 || !(scntl3 & 1)) {
7750 unsigned f2;
7751
7752 ncr_chip_reset(np, 5);
7753
7754 (void) ncrgetfreq (np, 11);
7755 f1 = ncrgetfreq (np, 11);
7756 f2 = ncrgetfreq (np, 11);
7757
7758 if(bootverbose)
7759 printk ("%s: NCR clock is %uKHz, %uKHz\n", ncr_name(np), f1, f2);
7760
7761 if (f1 > f2) f1 = f2;
7762
7763 if (f1 < 45000) f1 = 40000;
7764 else if (f1 < 55000) f1 = 50000;
7765 else f1 = 80000;
7766
7767 if (f1 < 80000 && mult > 1) {
7768 if (bootverbose >= 2)
7769 printk ("%s: clock multiplier assumed\n", ncr_name(np));
7770 np->multiplier = mult;
7771 }
7772 } else {
7773 if ((scntl3 & 7) == 3) f1 = 40000;
7774 else if ((scntl3 & 7) == 5) f1 = 80000;
7775 else f1 = 160000;
7776
7777 f1 /= np->multiplier;
7778 }
7779
7780
7781
7782
7783 f1 *= np->multiplier;
7784 np->clock_khz = f1;
7785 }
7786
7787
7788
7789 static int ncr53c8xx_slave_alloc(struct scsi_device *device)
7790 {
7791 struct Scsi_Host *host = device->host;
7792 struct ncb *np = ((struct host_data *) host->hostdata)->ncb;
7793 struct tcb *tp = &np->target[device->id];
7794 tp->starget = device->sdev_target;
7795
7796 return 0;
7797 }
7798
7799 static int ncr53c8xx_slave_configure(struct scsi_device *device)
7800 {
7801 struct Scsi_Host *host = device->host;
7802 struct ncb *np = ((struct host_data *) host->hostdata)->ncb;
7803 struct tcb *tp = &np->target[device->id];
7804 struct lcb *lp = tp->lp[device->lun];
7805 int numtags, depth_to_use;
7806
7807 ncr_setup_lcb(np, device);
7808
7809
7810
7811
7812
7813
7814
7815 numtags = device_queue_depth(np->unit, device->id, device->lun);
7816 if (numtags > tp->usrtags)
7817 numtags = tp->usrtags;
7818 if (!device->tagged_supported)
7819 numtags = 1;
7820 depth_to_use = numtags;
7821 if (depth_to_use < 2)
7822 depth_to_use = 2;
7823 if (depth_to_use > MAX_TAGS)
7824 depth_to_use = MAX_TAGS;
7825
7826 scsi_change_queue_depth(device, depth_to_use);
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837 if (lp) {
7838 lp->numtags = lp->maxtags = numtags;
7839 lp->scdev_depth = depth_to_use;
7840 }
7841 ncr_setup_tags (np, device);
7842
7843 #ifdef DEBUG_NCR53C8XX
7844 printk("ncr53c8xx_select_queue_depth: host=%d, id=%d, lun=%d, depth=%d\n",
7845 np->unit, device->id, device->lun, depth_to_use);
7846 #endif
7847
7848 if (spi_support_sync(device->sdev_target) &&
7849 !spi_initial_dv(device->sdev_target))
7850 spi_dv_device(device);
7851 return 0;
7852 }
7853
7854 static int ncr53c8xx_queue_command_lck(struct scsi_cmnd *cmd)
7855 {
7856 struct ncr_cmd_priv *cmd_priv = scsi_cmd_priv(cmd);
7857 void (*done)(struct scsi_cmnd *) = scsi_done;
7858 struct ncb *np = ((struct host_data *) cmd->device->host->hostdata)->ncb;
7859 unsigned long flags;
7860 int sts;
7861
7862 #ifdef DEBUG_NCR53C8XX
7863 printk("ncr53c8xx_queue_command\n");
7864 #endif
7865
7866 cmd->host_scribble = NULL;
7867 cmd_priv->data_mapped = 0;
7868 cmd_priv->data_mapping = 0;
7869
7870 spin_lock_irqsave(&np->smp_lock, flags);
7871
7872 if ((sts = ncr_queue_command(np, cmd)) != DID_OK) {
7873 set_host_byte(cmd, sts);
7874 #ifdef DEBUG_NCR53C8XX
7875 printk("ncr53c8xx : command not queued - result=%d\n", sts);
7876 #endif
7877 }
7878 #ifdef DEBUG_NCR53C8XX
7879 else
7880 printk("ncr53c8xx : command successfully queued\n");
7881 #endif
7882
7883 spin_unlock_irqrestore(&np->smp_lock, flags);
7884
7885 if (sts != DID_OK) {
7886 unmap_scsi_data(np, cmd);
7887 done(cmd);
7888 sts = 0;
7889 }
7890
7891 return sts;
7892 }
7893
7894 static DEF_SCSI_QCMD(ncr53c8xx_queue_command)
7895
7896 irqreturn_t ncr53c8xx_intr(int irq, void *dev_id)
7897 {
7898 unsigned long flags;
7899 struct Scsi_Host *shost = (struct Scsi_Host *)dev_id;
7900 struct host_data *host_data = (struct host_data *)shost->hostdata;
7901 struct ncb *np = host_data->ncb;
7902 struct scsi_cmnd *done_list;
7903
7904 #ifdef DEBUG_NCR53C8XX
7905 printk("ncr53c8xx : interrupt received\n");
7906 #endif
7907
7908 if (DEBUG_FLAGS & DEBUG_TINY) printk ("[");
7909
7910 spin_lock_irqsave(&np->smp_lock, flags);
7911 ncr_exception(np);
7912 done_list = np->done_list;
7913 np->done_list = NULL;
7914 spin_unlock_irqrestore(&np->smp_lock, flags);
7915
7916 if (DEBUG_FLAGS & DEBUG_TINY) printk ("]\n");
7917
7918 if (done_list)
7919 ncr_flush_done_cmds(done_list);
7920 return IRQ_HANDLED;
7921 }
7922
7923 static void ncr53c8xx_timeout(struct timer_list *t)
7924 {
7925 struct ncb *np = from_timer(np, t, timer);
7926 unsigned long flags;
7927 struct scsi_cmnd *done_list;
7928
7929 spin_lock_irqsave(&np->smp_lock, flags);
7930 ncr_timeout(np);
7931 done_list = np->done_list;
7932 np->done_list = NULL;
7933 spin_unlock_irqrestore(&np->smp_lock, flags);
7934
7935 if (done_list)
7936 ncr_flush_done_cmds(done_list);
7937 }
7938
7939 static int ncr53c8xx_bus_reset(struct scsi_cmnd *cmd)
7940 {
7941 struct ncb *np = ((struct host_data *) cmd->device->host->hostdata)->ncb;
7942 int sts;
7943 unsigned long flags;
7944 struct scsi_cmnd *done_list;
7945
7946
7947
7948
7949
7950
7951
7952
7953 spin_lock_irqsave(&np->smp_lock, flags);
7954 sts = ncr_reset_bus(np);
7955
7956 done_list = np->done_list;
7957 np->done_list = NULL;
7958 spin_unlock_irqrestore(&np->smp_lock, flags);
7959
7960 ncr_flush_done_cmds(done_list);
7961
7962 return sts;
7963 }
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979 #define next_wcmd host_scribble
7980
7981 static void insert_into_waiting_list(struct ncb *np, struct scsi_cmnd *cmd)
7982 {
7983 struct scsi_cmnd *wcmd;
7984
7985 #ifdef DEBUG_WAITING_LIST
7986 printk("%s: cmd %lx inserted into waiting list\n", ncr_name(np), (u_long) cmd);
7987 #endif
7988 cmd->next_wcmd = NULL;
7989 if (!(wcmd = np->waiting_list)) np->waiting_list = cmd;
7990 else {
7991 while (wcmd->next_wcmd)
7992 wcmd = (struct scsi_cmnd *) wcmd->next_wcmd;
7993 wcmd->next_wcmd = (char *) cmd;
7994 }
7995 }
7996
7997 static void process_waiting_list(struct ncb *np, int sts)
7998 {
7999 struct scsi_cmnd *waiting_list, *wcmd;
8000
8001 waiting_list = np->waiting_list;
8002 np->waiting_list = NULL;
8003
8004 #ifdef DEBUG_WAITING_LIST
8005 if (waiting_list) printk("%s: waiting_list=%lx processing sts=%d\n", ncr_name(np), (u_long) waiting_list, sts);
8006 #endif
8007 while ((wcmd = waiting_list) != NULL) {
8008 waiting_list = (struct scsi_cmnd *) wcmd->next_wcmd;
8009 wcmd->next_wcmd = NULL;
8010 if (sts == DID_OK) {
8011 #ifdef DEBUG_WAITING_LIST
8012 printk("%s: cmd %lx trying to requeue\n", ncr_name(np), (u_long) wcmd);
8013 #endif
8014 sts = ncr_queue_command(np, wcmd);
8015 }
8016 if (sts != DID_OK) {
8017 #ifdef DEBUG_WAITING_LIST
8018 printk("%s: cmd %lx done forced sts=%d\n", ncr_name(np), (u_long) wcmd, sts);
8019 #endif
8020 set_host_byte(wcmd, sts);
8021 ncr_queue_done_cmd(np, wcmd);
8022 }
8023 }
8024 }
8025
8026 #undef next_wcmd
8027
8028 static ssize_t show_ncr53c8xx_revision(struct device *dev,
8029 struct device_attribute *attr, char *buf)
8030 {
8031 struct Scsi_Host *host = class_to_shost(dev);
8032 struct host_data *host_data = (struct host_data *)host->hostdata;
8033
8034 return snprintf(buf, 20, "0x%x\n", host_data->ncb->revision_id);
8035 }
8036
8037 static struct device_attribute ncr53c8xx_revision_attr = {
8038 .attr = { .name = "revision", .mode = S_IRUGO, },
8039 .show = show_ncr53c8xx_revision,
8040 };
8041
8042 static struct attribute *ncr53c8xx_host_attrs[] = {
8043 &ncr53c8xx_revision_attr.attr,
8044 NULL
8045 };
8046
8047 ATTRIBUTE_GROUPS(ncr53c8xx_host);
8048
8049
8050
8051
8052
8053
8054
8055 #ifdef MODULE
8056 char *ncr53c8xx;
8057 module_param(ncr53c8xx, charp, 0);
8058 #endif
8059
8060 #ifndef MODULE
8061 static int __init ncr53c8xx_setup(char *str)
8062 {
8063 return sym53c8xx__setup(str);
8064 }
8065
8066 __setup("ncr53c8xx=", ncr53c8xx_setup);
8067 #endif
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079 struct Scsi_Host * __init ncr_attach(struct scsi_host_template *tpnt,
8080 int unit, struct ncr_device *device)
8081 {
8082 struct host_data *host_data;
8083 struct ncb *np = NULL;
8084 struct Scsi_Host *instance = NULL;
8085 u_long flags = 0;
8086 int i;
8087
8088 WARN_ON_ONCE(tpnt->cmd_size < sizeof(struct ncr_cmd_priv));
8089
8090 if (!tpnt->name)
8091 tpnt->name = SCSI_NCR_DRIVER_NAME;
8092 if (!tpnt->shost_groups)
8093 tpnt->shost_groups = ncr53c8xx_host_groups;
8094
8095 tpnt->queuecommand = ncr53c8xx_queue_command;
8096 tpnt->slave_configure = ncr53c8xx_slave_configure;
8097 tpnt->slave_alloc = ncr53c8xx_slave_alloc;
8098 tpnt->eh_bus_reset_handler = ncr53c8xx_bus_reset;
8099 tpnt->can_queue = SCSI_NCR_CAN_QUEUE;
8100 tpnt->this_id = 7;
8101 tpnt->sg_tablesize = SCSI_NCR_SG_TABLESIZE;
8102 tpnt->cmd_per_lun = SCSI_NCR_CMD_PER_LUN;
8103
8104 if (device->differential)
8105 driver_setup.diff_support = device->differential;
8106
8107 printk(KERN_INFO "ncr53c720-%d: rev 0x%x irq %d\n",
8108 unit, device->chip.revision_id, device->slot.irq);
8109
8110 instance = scsi_host_alloc(tpnt, sizeof(*host_data));
8111 if (!instance)
8112 goto attach_error;
8113 host_data = (struct host_data *) instance->hostdata;
8114
8115 np = __m_calloc_dma(device->dev, sizeof(struct ncb), "NCB");
8116 if (!np)
8117 goto attach_error;
8118 spin_lock_init(&np->smp_lock);
8119 np->dev = device->dev;
8120 np->p_ncb = vtobus(np);
8121 host_data->ncb = np;
8122
8123 np->ccb = m_calloc_dma(sizeof(struct ccb), "CCB");
8124 if (!np->ccb)
8125 goto attach_error;
8126
8127
8128 np->unit = unit;
8129 np->verbose = driver_setup.verbose;
8130 sprintf(np->inst_name, "ncr53c720-%d", np->unit);
8131 np->revision_id = device->chip.revision_id;
8132 np->features = device->chip.features;
8133 np->clock_divn = device->chip.nr_divisor;
8134 np->maxoffs = device->chip.offset_max;
8135 np->maxburst = device->chip.burst_max;
8136 np->myaddr = device->host_id;
8137
8138
8139 np->script0 = m_calloc_dma(sizeof(struct script), "SCRIPT");
8140 if (!np->script0)
8141 goto attach_error;
8142 np->scripth0 = m_calloc_dma(sizeof(struct scripth), "SCRIPTH");
8143 if (!np->scripth0)
8144 goto attach_error;
8145
8146 timer_setup(&np->timer, ncr53c8xx_timeout, 0);
8147
8148
8149
8150 np->paddr = device->slot.base;
8151 np->paddr2 = (np->features & FE_RAM) ? device->slot.base_2 : 0;
8152
8153 if (device->slot.base_v)
8154 np->vaddr = device->slot.base_v;
8155 else
8156 np->vaddr = ioremap(device->slot.base_c, 128);
8157
8158 if (!np->vaddr) {
8159 printk(KERN_ERR
8160 "%s: can't map memory mapped IO region\n",ncr_name(np));
8161 goto attach_error;
8162 } else {
8163 if (bootverbose > 1)
8164 printk(KERN_INFO
8165 "%s: using memory mapped IO at virtual address 0x%lx\n", ncr_name(np), (u_long) np->vaddr);
8166 }
8167
8168
8169
8170
8171
8172 np->reg = (struct ncr_reg __iomem *)np->vaddr;
8173
8174
8175 ncr_prepare_setting(np);
8176
8177 if (np->paddr2 && sizeof(struct script) > 4096) {
8178 np->paddr2 = 0;
8179 printk(KERN_WARNING "%s: script too large, NOT using on chip RAM.\n",
8180 ncr_name(np));
8181 }
8182
8183 instance->max_channel = 0;
8184 instance->this_id = np->myaddr;
8185 instance->max_id = np->maxwide ? 16 : 8;
8186 instance->max_lun = SCSI_NCR_MAX_LUN;
8187 instance->base = (unsigned long) np->reg;
8188 instance->irq = device->slot.irq;
8189 instance->unique_id = device->slot.base;
8190 instance->dma_channel = 0;
8191 instance->cmd_per_lun = MAX_TAGS;
8192 instance->can_queue = (MAX_START-4);
8193
8194
8195 BUG_ON(!ncr53c8xx_transport_template);
8196 instance->transportt = ncr53c8xx_transport_template;
8197
8198
8199 ncr_script_fill(&script0, &scripth0);
8200
8201 np->scripth = np->scripth0;
8202 np->p_scripth = vtobus(np->scripth);
8203 np->p_script = (np->paddr2) ? np->paddr2 : vtobus(np->script0);
8204
8205 ncr_script_copy_and_bind(np, (ncrcmd *) &script0,
8206 (ncrcmd *) np->script0, sizeof(struct script));
8207 ncr_script_copy_and_bind(np, (ncrcmd *) &scripth0,
8208 (ncrcmd *) np->scripth0, sizeof(struct scripth));
8209 np->ccb->p_ccb = vtobus (np->ccb);
8210
8211
8212
8213 if (np->features & FE_LED0) {
8214 np->script0->idle[0] =
8215 cpu_to_scr(SCR_REG_REG(gpreg, SCR_OR, 0x01));
8216 np->script0->reselected[0] =
8217 cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe));
8218 np->script0->start[0] =
8219 cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe));
8220 }
8221
8222
8223
8224
8225
8226
8227 for (i = 0 ; i < 4 ; i++) {
8228 np->jump_tcb[i].l_cmd =
8229 cpu_to_scr((SCR_JUMP ^ IFTRUE (MASK (i, 3))));
8230 np->jump_tcb[i].l_paddr =
8231 cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_target));
8232 }
8233
8234 ncr_chip_reset(np, 100);
8235
8236
8237
8238 if (ncr_snooptest(np)) {
8239 printk(KERN_ERR "CACHE INCORRECTLY CONFIGURED.\n");
8240 goto attach_error;
8241 }
8242
8243
8244 np->irq = device->slot.irq;
8245
8246
8247 ncr_init_ccb(np, np->ccb);
8248
8249
8250
8251
8252
8253
8254
8255 spin_lock_irqsave(&np->smp_lock, flags);
8256 if (ncr_reset_scsi_bus(np, 0, driver_setup.settle_delay) != 0) {
8257 printk(KERN_ERR "%s: FATAL ERROR: CHECK SCSI BUS - CABLES, TERMINATION, DEVICE POWER etc.!\n", ncr_name(np));
8258
8259 spin_unlock_irqrestore(&np->smp_lock, flags);
8260 goto attach_error;
8261 }
8262 ncr_exception(np);
8263
8264 np->disc = 1;
8265
8266
8267
8268
8269
8270 if (driver_setup.settle_delay > 2) {
8271 printk(KERN_INFO "%s: waiting %d seconds for scsi devices to settle...\n",
8272 ncr_name(np), driver_setup.settle_delay);
8273 mdelay(1000 * driver_setup.settle_delay);
8274 }
8275
8276
8277 np->lasttime=0;
8278 ncr_timeout (np);
8279
8280
8281 #ifdef SCSI_NCR_ALWAYS_SIMPLE_TAG
8282 np->order = SIMPLE_QUEUE_TAG;
8283 #endif
8284
8285 spin_unlock_irqrestore(&np->smp_lock, flags);
8286
8287 return instance;
8288
8289 attach_error:
8290 if (!instance)
8291 return NULL;
8292 printk(KERN_INFO "%s: detaching...\n", ncr_name(np));
8293 if (!np)
8294 goto unregister;
8295 if (np->scripth0)
8296 m_free_dma(np->scripth0, sizeof(struct scripth), "SCRIPTH");
8297 if (np->script0)
8298 m_free_dma(np->script0, sizeof(struct script), "SCRIPT");
8299 if (np->ccb)
8300 m_free_dma(np->ccb, sizeof(struct ccb), "CCB");
8301 m_free_dma(np, sizeof(struct ncb), "NCB");
8302 host_data->ncb = NULL;
8303
8304 unregister:
8305 scsi_host_put(instance);
8306
8307 return NULL;
8308 }
8309
8310
8311 void ncr53c8xx_release(struct Scsi_Host *host)
8312 {
8313 struct host_data *host_data = shost_priv(host);
8314 #ifdef DEBUG_NCR53C8XX
8315 printk("ncr53c8xx: release\n");
8316 #endif
8317 if (host_data->ncb)
8318 ncr_detach(host_data->ncb);
8319 scsi_host_put(host);
8320 }
8321
8322 static void ncr53c8xx_set_period(struct scsi_target *starget, int period)
8323 {
8324 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
8325 struct ncb *np = ((struct host_data *)shost->hostdata)->ncb;
8326 struct tcb *tp = &np->target[starget->id];
8327
8328 if (period > np->maxsync)
8329 period = np->maxsync;
8330 else if (period < np->minsync)
8331 period = np->minsync;
8332
8333 tp->usrsync = period;
8334
8335 ncr_negotiate(np, tp);
8336 }
8337
8338 static void ncr53c8xx_set_offset(struct scsi_target *starget, int offset)
8339 {
8340 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
8341 struct ncb *np = ((struct host_data *)shost->hostdata)->ncb;
8342 struct tcb *tp = &np->target[starget->id];
8343
8344 if (offset > np->maxoffs)
8345 offset = np->maxoffs;
8346 else if (offset < 0)
8347 offset = 0;
8348
8349 tp->maxoffs = offset;
8350
8351 ncr_negotiate(np, tp);
8352 }
8353
8354 static void ncr53c8xx_set_width(struct scsi_target *starget, int width)
8355 {
8356 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
8357 struct ncb *np = ((struct host_data *)shost->hostdata)->ncb;
8358 struct tcb *tp = &np->target[starget->id];
8359
8360 if (width > np->maxwide)
8361 width = np->maxwide;
8362 else if (width < 0)
8363 width = 0;
8364
8365 tp->usrwide = width;
8366
8367 ncr_negotiate(np, tp);
8368 }
8369
8370 static void ncr53c8xx_get_signalling(struct Scsi_Host *shost)
8371 {
8372 struct ncb *np = ((struct host_data *)shost->hostdata)->ncb;
8373 enum spi_signal_type type;
8374
8375 switch (np->scsi_mode) {
8376 case SMODE_SE:
8377 type = SPI_SIGNAL_SE;
8378 break;
8379 case SMODE_HVD:
8380 type = SPI_SIGNAL_HVD;
8381 break;
8382 default:
8383 type = SPI_SIGNAL_UNKNOWN;
8384 break;
8385 }
8386 spi_signalling(shost) = type;
8387 }
8388
8389 static struct spi_function_template ncr53c8xx_transport_functions = {
8390 .set_period = ncr53c8xx_set_period,
8391 .show_period = 1,
8392 .set_offset = ncr53c8xx_set_offset,
8393 .show_offset = 1,
8394 .set_width = ncr53c8xx_set_width,
8395 .show_width = 1,
8396 .get_signalling = ncr53c8xx_get_signalling,
8397 };
8398
8399 int __init ncr53c8xx_init(void)
8400 {
8401 ncr53c8xx_transport_template = spi_attach_transport(&ncr53c8xx_transport_functions);
8402 if (!ncr53c8xx_transport_template)
8403 return -ENODEV;
8404 return 0;
8405 }
8406
8407 void ncr53c8xx_exit(void)
8408 {
8409 spi_release_transport(ncr53c8xx_transport_template);
8410 }