diff options
Diffstat (limited to 'audio/cdparanoia/files/patch-interface-scsi_interface.c')
-rw-r--r-- | audio/cdparanoia/files/patch-interface-scsi_interface.c | 313 |
1 files changed, 0 insertions, 313 deletions
diff --git a/audio/cdparanoia/files/patch-interface-scsi_interface.c b/audio/cdparanoia/files/patch-interface-scsi_interface.c deleted file mode 100644 index b482169..0000000 --- a/audio/cdparanoia/files/patch-interface-scsi_interface.c +++ /dev/null @@ -1,313 +0,0 @@ ---- interface/scsi_interface.c.orig 2001-03-23 17:15:46.000000000 -0800 -+++ interface/scsi_interface.c 2011-10-17 21:33:00.000000000 -0700 -@@ -3,6 +3,8 @@ - * Original interface.c Copyright (C) 1994-1997 - * Eissfeldt heiko@colossus.escape.de - * Current blenderization Copyright (C) 1998-1999 Monty xiphmont@mit.edu -+ * FreeBSD porting (c) 2003 -+ * Simon 'corecode' Schubert <corecode@corecode.ath.cx> - * - * Generic SCSI interface specific code. - * -@@ -23,6 +25,7 @@ - int table,reserved; - char buffer[256]; - -+#ifdef Linux - /* maximum transfer size? */ - if(ioctl(d->cdda_fd,SG_GET_RESERVED_SIZE,&reserved)){ - /* Up, guess not. */ -@@ -59,8 +62,17 @@ - cdmessage(d,"\tCouldn't disable command queue! Continuing anyway...\n"); - } - -+#elif defined(__FreeBSD__) -+ d->nsectors = 26; /* FreeBSD only supports 64K I/O transfer size */ -+ d->bigbuff = d->nsectors * CD_FRAMESIZE_RAW; -+ -+ sprintf(buffer,"\tSetting default read size to %d sectors (%d bytes).\n\n", -+ d->nsectors,d->nsectors*CD_FRAMESIZE_RAW); -+ cdmessage(d,buffer); -+#endif - } - -+#ifdef Linux - static void reset_scsi(cdrom_drive *d){ - int arg; - d->enable_cdda(d,0); -@@ -74,6 +86,30 @@ - d->enable_cdda(d,1); - } - -+#elif defined(__FreeBSD__) -+static void reset_scsi(cdrom_drive *d) { -+ d->enable_cdda(d,0); -+ -+ d->ccb->ccb_h.func_code = XPT_RESET_DEV; -+ d->ccb->ccb_h.timeout = 5000; -+ -+ cdmessage(d, "sending SCSI reset... "); -+ if (cam_send_ccb(d->dev, d->ccb)) { -+ cdmessage(d, "error sending XPT_RESET_DEV CCB"); -+ } else { -+ -+ if (((d->ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) || -+ ((d->ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_BDR_SENT)) -+ cdmessage(d,"OK\n"); -+ else -+ cdmessage(d,"FAILED\n"); -+ } -+ -+ d->enable_cdda(d,1); -+} -+#endif -+ -+#ifdef Linux - static void clear_garbage(cdrom_drive *d){ - fd_set fdset; - struct timeval tv; -@@ -104,8 +140,10 @@ - flag=1; - } - } -+#endif - - /* process a complete scsi command. */ -+#ifdef Linux - static int handle_scsi_cmd(cdrom_drive *d, - unsigned int cmd_len, - unsigned int in_size, -@@ -284,6 +322,95 @@ - return(0); - } - -+#elif defined(__FreeBSD__) -+static int handle_scsi_cmd(cdrom_drive *d, -+ unsigned int cmd_len, -+ unsigned int out_size, -+ unsigned int in_size, -+ unsigned char bytefill, -+ int bytecheck) { -+ int result; -+ int error_code, sense_key, asc, ascq; -+ -+ bzero(&d->ccb->csio, sizeof(d->ccb->csio)); -+ -+ memcpy(d->ccb->csio.cdb_io.cdb_bytes, d->sg_buffer, cmd_len); -+ -+ if (bytecheck && out_size == 0) -+ memset(d->sg_buffer, bytefill, in_size); -+ -+ cam_fill_csio(&d->ccb->csio, -+ /* retries */ 0, -+ /* cbfcnp */ NULL, -+ /* flags */ CAM_DEV_QFRZDIS | (out_size ? CAM_DIR_OUT : CAM_DIR_IN), -+ /* tag_action */ MSG_SIMPLE_Q_TAG, -+ /* data_ptr */ out_size ? d->sg_buffer + cmd_len : d->sg_buffer, -+ /* dxfer_len */ out_size ? out_size : in_size, -+ /* sense_len */ SSD_FULL_SIZE, -+ /* cdb_len */ cmd_len, -+ /* timeout */ 60000); /* XXX */ -+ -+ if ((result = cam_send_ccb(d->dev, d->ccb)) < 0 || -+ (d->ccb->ccb_h.status & CAM_STATUS_MASK) == 0 /* hack? */) -+ return TR_EREAD; -+ -+ if ((d->ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP && -+ (d->ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR) { -+ fprintf (stderr, "\t\terror returned from SCSI command:\n" -+ "\t\tccb->ccb_h.status == %d\n", d->ccb->ccb_h.status); -+ errno = EIO; -+ return TR_UNKNOWN; -+ } -+ -+ if (d->ccb->csio.dxfer_len != in_size) { -+ errno = EIO; -+ return TR_EREAD; -+ } -+ -+ scsi_extract_sense(&d->ccb->csio.sense_data, &error_code, &sense_key, -+ &asc, &ascq); -+ -+ switch (error_code) { -+ case SSD_CURRENT_ERROR: -+ case SSD_DEFERRED_ERROR: -+#if (CAM_VERSION > 0x15) -+ case SSD_DESC_CURRENT_ERROR: -+ case SSD_DESC_DEFERRED_ERROR: -+#endif -+ switch (sense_key) { -+ case SSD_KEY_NO_SENSE: -+ errno = EIO; -+ return TR_UNKNOWN; -+ case SSD_KEY_RECOVERED_ERROR: -+ break; -+ case SSD_KEY_NOT_READY: -+ errno = EBUSY; -+ return TR_BUSY; -+ case SSD_KEY_MEDIUM_ERROR: -+ errno = EIO; -+ if ((asc == 0x0c) && (ascq == 0x09)) -+ return TR_STREAMING; -+ else -+ return TR_MEDIUM; -+ case SSD_KEY_HARDWARE_ERROR: -+ errno = EIO; -+ return TR_FAULT; -+ case SSD_KEY_ILLEGAL_REQUEST: -+ errno = EINVAL; -+ return TR_ILLEGAL; -+ default: -+ errno = EIO; -+ return TR_UNKNOWN; -+ } -+ default: -+ break; -+ } -+ -+ return 0; -+} -+#endif -+ -+ - /* Group 1 (10b) command */ - - static int mode_sense_atapi(cdrom_drive *d,int size,int page){ -@@ -833,30 +960,37 @@ - while(1) { - if((err=map(d,(p?buffer:NULL),begin,sectors))){ - if(d->report_all){ -+#ifdef Linux - struct sg_header *sg_hd=(struct sg_header *)d->sg; -+#elif defined(__FreeBSD__) -+ int error_code, sense_key, asc, ascq; -+#endif - char b[256]; - - sprintf(b,"scsi_read error: sector=%ld length=%ld retry=%d\n", - begin,sectors,retry_count); -+ fputs(b, stderr); - cdmessage(d,b); -+#if defined(__FreeBSD__) -+ scsi_extract_sense(&d->ccb->csio.sense_data, &error_code, &sense_key, -+ &asc, &ascq); -+#endif - sprintf(b," Sense key: %x ASC: %x ASCQ: %x\n", -+#ifdef Linux - (int)(sg_hd->sense_buffer[2]&0xf), - (int)(sg_hd->sense_buffer[12]), - (int)(sg_hd->sense_buffer[13])); -+#elif defined(__FreeBSD__) -+ sense_key, asc, ascq); -+#endif -+ fputs(b, stderr); - cdmessage(d,b); - sprintf(b," Transport error: %s\n",strerror_tr[err]); -+ fputs(b, stderr); - cdmessage(d,b); - sprintf(b," System error: %s\n",strerror(errno)); -+ fputs(b, stderr); - cdmessage(d,b); -- -- fprintf(stderr,"scsi_read error: sector=%ld length=%ld retry=%d\n", -- begin,sectors,retry_count); -- fprintf(stderr," Sense key: %x ASC: %x ASCQ: %x\n", -- (int)(sg_hd->sense_buffer[2]&0xf), -- (int)(sg_hd->sense_buffer[12]), -- (int)(sg_hd->sense_buffer[13])); -- fprintf(stderr," Transport error: %s\n",strerror_tr[err]); -- fprintf(stderr," System error: %s\n",strerror(errno)); - } - - if(!d->error_retry)return(-7); -@@ -1307,6 +1441,7 @@ - return; - } - -+#ifdef Linux - static int check_atapi(cdrom_drive *d){ - int atapiret=-1; - int fd = d->cdda_fd; /* this is the correct fd (not ioctl_fd), as the -@@ -1333,6 +1468,53 @@ - } - } - -+#elif defined(__FreeBSD__) -+static int -+check_atapi(cdrom_drive *d) -+{ -+ bzero(&(&d->ccb->ccb_h)[1], sizeof(d->ccb->cpi) - sizeof(d->ccb->ccb_h)); -+ -+ d->ccb->ccb_h.func_code = XPT_PATH_INQ; -+ -+ cdmessage(d, "\nChecking for ATAPICAM...\n"); -+ -+ if (cam_send_ccb(d->dev, d->ccb) < 0) { -+ cderror(d, "\terror sending XPT_PATH_INQ CCB: "); -+ cderror(d, cam_errbuf); -+ cderror(d, "\n"); -+ return -1; -+ } -+ -+ if ((d->ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { -+ cderror(d, "\tXPT_PATH_INQ CCB failed: "); -+ cderror(d, cam_errbuf); -+ cderror(d, "\n"); -+ return -1; -+ } -+ -+ /* -+ * if the bus device name is `ata', we're (obviously) -+ * running ATAPICAM. -+ * same for the new ahci(4) and siis(4) drivers and future others -+ * which use SATA transport too... -+ */ -+ -+ if (strncmp(d->ccb->cpi.dev_name, "ata", 3) == 0 || -+#if __FreeBSD_version >= 800102 -+ d->ccb->cpi.transport == XPORT_SATA || -+#endif -+ d->ccb->cpi.transport == XPORT_ATA) { -+ cdmessage(d, "\tDrive is ATAPI (using ATAPICAM or direct CAM (S)ATA transport)\n"); -+ d->is_atapi = 1; -+ } else { -+ cdmessage(d, "\tDrive is SCSI\n"); -+ d->is_atapi = 0; -+ } -+ -+ return d->is_atapi; -+} -+#endif -+ - static int check_mmc(cdrom_drive *d){ - char *b; - cdmessage(d,"\nChecking for MMC style command set...\n"); -@@ -1379,6 +1561,7 @@ - } - } - -+#ifdef Linux - /* request vendor brand and model */ - unsigned char *scsi_inquiry(cdrom_drive *d){ - memcpy(d->sg_buffer,(char[]){ 0x12,0,0,0,56,0},6); -@@ -1389,6 +1572,7 @@ - } - return (d->sg_buffer); - } -+#endif - - - int scsi_init_drive(cdrom_drive *d){ -@@ -1458,8 +1642,12 @@ - check_fua_bit(d); - - d->error_retry=1; -+#ifdef Linux - d->sg=realloc(d->sg,d->nsectors*CD_FRAMESIZE_RAW + SG_OFF + 128); - d->sg_buffer=d->sg+SG_OFF; -+#elif defined(__FreeBSD__) -+ d->sg_buffer = realloc(d->sg_buffer, d->nsectors * CD_FRAMESIZE_RAW); -+#endif - d->report_all=1; - return(0); - } |