|
|
linux 0.98
*** aha1542.c.~1~ Sat Sep 12 15:29:26 1992
--- aha1542.c Thu Sep 17 22:11:55 1992
***************
*** 72,77 ****
--- 72,90 ----
return 1;
}
+ static int aha1542_in(unchar *cmdp, int len)
+ {
+ while (len--)
+ {
+ WAIT(STATUS, DF, DF, 0);
+ *cmdp++ = inb(DATA);
+ }
+ return 0;
+ fail:
+ printk("aha1542_in failed(%d): ", len+1); aha1542_stat();
+ return 1;
+ }
+
int makecode(unsigned hosterr, unsigned scsierr)
{
switch (hosterr) {
***************
*** 259,264 ****
--- 272,278 ----
int aha1542_queuecommand(unchar target, const void *cmnd, void *buff, int bufflen, void (*done)(int, int))
{
unchar ahacmd = CMD_START_SCSI;
+ unchar direction;
unchar *cmd = (unchar *) cmnd;
DEB(int i);
***************
*** 292,300 ****
ccb.cdblen = (*cmd<=0x1f)?6:10; /* SCSI Command Descriptor Block Length */
memcpy(ccb.cdb, cmd, ccb.cdblen);
ccb.op = 0; /* SCSI Initiator Command */
! ccb.idlun = (target&7)<<5; /* SCSI Target Id */
ccb.rsalen = 12;
any2scsi(ccb.datalen, bufflen);
any2scsi(ccb.dataptr, buff);
--- 306,318 ----
ccb.cdblen = (*cmd<=0x1f)?6:10; /* SCSI Command Descriptor Block Length */
direction = 0;
if (*cmd == READ_10 || *cmd == READ_6) direction = 8;
else if (*cmd == WRITE_10 || *cmd == WRITE_6) direction = 16;
memcpy(ccb.cdb, cmd, ccb.cdblen);
ccb.op = 0; /* SCSI Initiator Command */
! ccb.idlun = (target&7)<<5 | direction; /* SCSI Target Id */
ccb.rsalen = 12;
any2scsi(ccb.datalen, bufflen);
any2scsi(ccb.dataptr, buff);
***************
*** 369,374 ****
--- 387,416 ----
set_intr_gate(0x2b,&aha1542_interrupt);
}
+
+ /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
+ static void aha1542_query()
+ {
+ static unchar inquiry_cmd[] = {CMD_INQUIRY };
+ static unchar inquiry_result[4];
+ int i;
+ i = inb(STATUS);
+ if (i & DF) {
+ i = inb(DATA);
+ printk("Stale data:%x ");
+ };
+ aha1542_out(inquiry_cmd, 1);
+ aha1542_in(inquiry_result, 4);
+ WAIT(INTRFLAGS, INTRMASK, HACC, 0);
+ while (0) {
+ fail:
+ printk("aha1542_detect: query card type\n");
+ }
+ aha1542_intr_reset();
+ printk("Inquiry:");
+ for(i=0;i<4;i++) printk("%x ",inquiry_result[i]);
+ }
+
/* return non-zero on detection */
int aha1542_detect(int hostnum)
{
***************
*** 397,402 ****
--- 439,446 ----
}
aha1542_intr_reset();
}
+
+ aha1542_query();
DEB(aha1542_stat());
setup_mailboxes();
*** scsi.c.~1~ Sat Sep 12 15:29:26 1992
--- scsi.c Wed Sep 16 01:00:44 1992
***************
*** 671,677 ****
--- 671,680 ----
sti();
if (!(last_cmnd[host].flags & WAS_RESET))
+ {
reset(host);
+ return;
+ }
else
{
exit = (DRIVER_HARD | SUGGEST_ABORT);
***************
*** 768,773 ****
--- 771,777 ----
case RESERVATION_CONFLICT:
reset(host);
+ return;
exit = DRIVER_SOFT | SUGGEST_ABORT;
status = MAYREDO;
break;
***************
*** 841,848 ****
--- 845,854 ----
{
if ((last_cmnd[host].retries >= (last_cmnd[host].allowed >> 1))
&& !(last_cmnd[host].flags & WAS_RESET))
+ {
reset(host);
break;
+ };
}
else
*** sd.c.~1~ Sat Sep 12 15:29:26 1992
--- sd.c Thu Sep 17 23:04:40 1992
***************
*** 39,45 ****
int NR_SD=0;
Scsi_Disk rscsi_disks[MAX_SD];
static int sd_sizes[MAX_SD << 4] = {0, };
! static int this_count;
static int the_result;
static char sense_buffer[255];
--- 39,45 ----
int NR_SD=0;
Scsi_Disk rscsi_disks[MAX_SD];
static int sd_sizes[MAX_SD << 4] = {0, };
! static int this_count, total_count = 0;
static int the_result;
static char sense_buffer[255];
***************
*** 108,113 ****
--- 108,120 ----
if (!result) {
CURRENT->nr_sectors -= this_count;
+ total_count -= this_count;
+ if(total_count){
+ CURRENT->sector += this_count;
+ CURRENT->buffer += (this_count << 9);
+ do_sd_request();
+ return;
+ };
#ifdef DEBUG
printk("sd%d : %d sectors remain.\n", MINOR(CURRENT->dev), CURRENT->nr_sectors);
***************
*** 248,253 ****
--- 255,266 ----
this_count = CURRENT->nr_sectors;
else
this_count = (BLOCK_SIZE / 512);
+
+
+ /* This is a temporary hack for the AHA1742. */
+ if(total_count == 0)
+ total_count = this_count;
+ this_count = 1; /* Take only 512 bytes at a time */
#ifdef DEBUG
printk("sd%d : %s %d/%d 512 byte blocks.\n", MINOR(CURRENT->dev),
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.