| plan 9 kernel history: overview | file list | diff list |
1991/0423/port/devscsi.c (diff list | history)
| 1991/0419/sys/src/9/port/devscsi.c:24,30 – 1991/0423/sys/src/9/port/devscsi.c:24,31 (short | long | prev | next) | ||
| 1991/0110 | #define NSCSI (sizeof scsidir/sizeof(Dirtab)) static Scsi staticcmd; /* BUG */ | |
| 1991/0423 | #define DATASIZE (8*1024) static uchar datablk[DATASIZE]; /* BUG */ | |
| 1991/0110 | static int debugs[8]; static int isscsi; | |
| 1991/0419/sys/src/9/port/devscsi.c:120,126 – 1991/0423/sys/src/9/port/devscsi.c:121,138 | ||
| 1991/0110 | void scsiclose(Chan *c) | |
| 1991/0423 | { Scsi *cmd = &staticcmd; if((c->qid.path & CHDIR) || c->qid.path==1) return; if((c->qid.path & 0xf) == Qcmd){ if(canqlock(cmd) || cmd->pid == u->p->pid){ cmd->pid = 0; qunlock(cmd); } } } | |
| 1991/0110 | long | |
| 1991/0411 | scsiread(Chan *c, char *a, long n, ulong offset) | |
| 1991/0419/sys/src/9/port/devscsi.c:132,137 – 1991/0423/sys/src/9/port/devscsi.c:144,150 | ||
| 1991/0110 | return devdirread(c, a, n, 0, 0, scsigen); if(c->qid.path==1){ | |
| 1991/0411 | if(offset == 0){ | |
| 1991/0423 | /*void scsidump(void); scsidump();*/ | |
| 1991/0110 | *a = ownid; n = 1; }else | |
| 1991/0419/sys/src/9/port/devscsi.c:140,156 – 1991/0423/sys/src/9/port/devscsi.c:153,178 | ||
| 1991/0110 | case Qcmd: if (n < 4) error(Ebadarg); | |
| 1991/0423 | if(canqlock(cmd)){ | |
| 1991/0110 | qunlock(cmd); error(Egreg); | |
| 1991/0423 | } if(cmd->pid != u->p->pid) error(Egreg); | |
| 1991/0110 | n = 4; | |
| 1991/0423 | *a++ = 0; *a++ = 0; | |
| 1991/0110 | *a++ = cmd->status>>8; *a = cmd->status; | |
| 1991/0423 | cmd->pid = 0; qunlock(cmd); | |
| 1991/0110 | break; case Qdata: | |
| 1991/0423 | if(canqlock(cmd)){ qunlock(cmd); error(Egreg); } if(cmd->pid != u->p->pid) error(Egreg); if (n > DATASIZE) | |
| 1991/0110 | error(Ebadarg); cmd->data.base = datablk; cmd->data.lim = cmd->data.base + n; | |
| 1991/0419/sys/src/9/port/devscsi.c:181,187 – 1991/0423/sys/src/9/port/devscsi.c:203,209 | ||
| 1991/0411 | if(offset == 0){ | |
| 1991/0110 | n = 1; ownid=*a; | |
| 1991/0423 | scsireset(); | |
| 1991/0110 | }else n = 0; }else switch ((int)c->qid.path & 0xf){ | |
| 1991/0419/sys/src/9/port/devscsi.c:188,194 – 1991/0423/sys/src/9/port/devscsi.c:210,217 | ||
| 1991/0110 | case Qcmd: if (n < 6 || n > sizeof cmd->cmdblk) error(Ebadarg); | |
| 1991/0423 | qlock(cmd); cmd->pid = u->p->pid; | |
| 1991/0110 | cmd->cmd.base = cmd->cmdblk; | |
| 1991/0318 | memmove(cmd->cmd.base, a, n); | |
| 1991/0110 | cmd->cmd.lim = cmd->cmd.base + n; | |
| 1991/0419/sys/src/9/port/devscsi.c:195,205 – 1991/0423/sys/src/9/port/devscsi.c:218,233 | ||
| 1991/0110 | cmd->cmd.ptr = cmd->cmd.base; cmd->target = (c->qid.path>>4)&7; cmd->lun = (a[1]>>5)&7; | |
| 1991/0423 | if(canqlock(cmd)){ qunlock(cmd); error(Egreg); } if(cmd->pid != u->p->pid) error(Egreg); if (n > DATASIZE) | |
| 1991/0110 | error(Ebadarg); cmd->data.base = datablk; cmd->data.lim = cmd->data.base + n; | |
| 1991/0419/sys/src/9/port/devscsi.c:234,251 – 1991/0423/sys/src/9/port/devscsi.c:262,282 | ||
| 1991/0110 | error(Eperm); } | |
| 1991/0423 | Scsi * scsicmd(int dev, int cmdbyte, long size) | |
| 1991/0110 | { | |
| 1991/0423 | Scsi *cmd = &staticcmd; if(size > DATASIZE) panic("scsicmd %d", size); | |
| 1991/0110 | qlock(cmd); cmd->target = dev>>3; cmd->lun = dev&7; cmd->cmd.base = cmd->cmdblk; | |
| 1991/0423 | switch(cmdbyte>>5){ | |
| 1991/0110 | case 0: cmd->cmd.lim = &cmd->cmdblk[6]; break; case 1: | |
| 1991/0419/sys/src/9/port/devscsi.c:253,259 – 1991/0423/sys/src/9/port/devscsi.c:284,290 | ||
| 1991/0110 | default: cmd->cmd.lim = &cmd->cmdblk[12]; break; } | |
| 1991/0423 | switch(cmdbyte){ | |
| 1991/0110 | case 0x00: /* test unit ready */ break; case 0x03: /* read sense data */ | |
| 1991/0419/sys/src/9/port/devscsi.c:262,280 – 1991/0423/sys/src/9/port/devscsi.c:293,313 | ||
| 1991/0110 | case 0x25: /* read capacity */ break; } | |
| 1991/0423 | cmd->data.base = datablk; | |
| 1991/0110 | cmd->data.lim = cmd->data.base + size; cmd->data.ptr = cmd->data.base; cmd->save = cmd->data.base; | |
| 1991/0423 | return cmd; | |
| 1991/0110 | } int scsiready(int dev) { | |
| 1991/0423 | Scsi *cmd = scsicmd(dev, 0x00, 0); | |
| 1991/0110 | int status; | |
| 1991/0423 | status = scsiexec(cmd, 0); qunlock(cmd); | |
| 1991/0110 | if ((status&0xff00) != 0x6000) error(Eio); return status&0xff; | |
| 1991/0419/sys/src/9/port/devscsi.c:281,295 – 1991/0423/sys/src/9/port/devscsi.c:314,327 | ||
| 1991/0110 | } int | |
| 1991/0423 | scsisense(int dev, void *p) | |
| 1991/0110 | { | |
| 1991/0423 | Scsi *cmd = scsicmd(dev, 0x03, 18); | |
| 1991/0110 | int status; | |
| 1991/0318 |
| |
| 1991/0110 |
| |
| 1991/0423 | status = scsiexec(cmd, 1); memmove(p, cmd->data.base, 18); qunlock(cmd); | |
| 1991/0110 | if ((status&0xff00) != 0x6000) error(Eio); return status&0xff; | |
| 1991/0419/sys/src/9/port/devscsi.c:296,310 – 1991/0423/sys/src/9/port/devscsi.c:328,341 | ||
| 1991/0110 | } int | |
| 1991/0423 | scsicap(int dev, void *p) | |
| 1991/0110 | { | |
| 1991/0423 | Scsi *cmd = scsicmd(dev, 0x25, 8); | |
| 1991/0110 | int status; | |
| 1991/0318 |
| |
| 1991/0110 |
| |
| 1991/0423 | status = scsiexec(cmd, 1); memmove(p, cmd->data.base, 8); qunlock(cmd); | |
| 1991/0110 | if ((status&0xff00) != 0x6000) error(Eio); return status&0xff; | |
| 1991/0419/sys/src/9/port/devscsi.c:381,386 – 1991/0423/sys/src/9/port/devscsi.c:412,418 | ||
| 1991/0110 | nexterror(); } scsirflag = rflag; | |
| 1991/0423 | p->rflag = rflag; | |
| 1991/0110 | datap = p->data.base; if ((ownid & 0x08) && rflag) PUT(Dest_id, 0x40|p->target); | |