diff options
author | Tobias Rehbein <tobias.rehbein@web.de> | 2024-07-04 06:24:52 +0000 |
---|---|---|
committer | Alexey Dokuchaev <danfe@FreeBSD.org> | 2024-07-04 06:24:52 +0000 |
commit | d0b1d9ec73207ca2400394af1db811ddcf3d2759 (patch) | |
tree | a2baeeddc17afba8863fb57cbd5447857222321f /audio/cdparanoia/files/patch-interface_scsi__interface.c | |
parent | sysutils/mackerel-agent: Update to 0.82.0 (diff) |
audio/cdparanoia: the port had been updated to version III-10.2
- GC no longer useful post-patch target and GNU_CONFIGURE_MANPREFIX
- Replace stripping in post-install with proper BSD_INSTALL_* calls
PR: 200925
Diffstat (limited to 'audio/cdparanoia/files/patch-interface_scsi__interface.c')
-rw-r--r-- | audio/cdparanoia/files/patch-interface_scsi__interface.c | 238 |
1 files changed, 138 insertions, 100 deletions
diff --git a/audio/cdparanoia/files/patch-interface_scsi__interface.c b/audio/cdparanoia/files/patch-interface_scsi__interface.c index 15fe0300e0d7..a1bff608f9d5 100644 --- a/audio/cdparanoia/files/patch-interface_scsi__interface.c +++ b/audio/cdparanoia/files/patch-interface_scsi__interface.c @@ -1,117 +1,117 @@ ---- interface/scsi_interface.c.orig 2001-03-24 01:15:46 UTC +--- interface/scsi_interface.c.orig 2019-07-25 21:55:03 UTC +++ interface/scsi_interface.c @@ -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 + * Current incarnation Copyright (C) 1998-2008 Monty xiphmont@mit.edu + * FreeBSD porting (c) 2003 + * Simon 'corecode' Schubert <corecode@corecode.ath.cx> * * Generic SCSI interface specific code. * -@@ -23,6 +25,7 @@ static void tweak_SG_buffer(cdrom_drive - int table,reserved; +@@ -36,6 +38,7 @@ static void tweak_SG_buffer(cdrom_drive *d) { + int table, reserved, cur, err; 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 @@ static void tweak_SG_buffer(cdrom_drive - 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); + /* SG_SET_RESERVED_SIZE doesn't actually allocate or reserve anything. + * what it _does_ do is give you an error if you ask for a value + * larger than q->max_sectors (the length of the device's bio request +@@ -54,6 +57,10 @@ static void tweak_SG_buffer(cdrom_drive *d) { + implement working sg lists with SG_IO devices, so who knows... */ + if (ioctl(d->cdda_fd, SG_GET_SG_TABLESIZE, &table) < 0) + table=1; ++#else ++ reserved = 26 * CD_FRAMESIZE_RAW; /* FreeBSD only supports 64K I/O transfer size */ ++ table = 1; +#endif - } -+#ifdef Linux - static void reset_scsi(cdrom_drive *d){ - int arg; - d->enable_cdda(d,0); -@@ -74,6 +86,30 @@ static void reset_scsi(cdrom_drive *d){ - d->enable_cdda(d,1); + sprintf(buffer,"\tDMA scatter/gather table entries: %d\n\t" + "table entry size: %d bytes\n\t" +@@ -93,6 +100,7 @@ static void tweak_SG_buffer(cdrom_drive *d) { + cdmessage(d,buffer); } -+#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 @@ static void clear_garbage(cdrom_drive *d +@@ -123,6 +131,7 @@ static void clear_garbage(cdrom_drive *d){ flag=1; } } +#endif + static int check_sbp_error(const unsigned char status, + const unsigned char *sbp) { +@@ -172,6 +181,7 @@ static int check_sbp_error(const unsigned char status, + return 0; + } + ++#ifdef Linux /* process a complete scsi command. */ + static int sg2_handle_scsi_cmd(cdrom_drive *d, + unsigned char *cmd, +@@ -332,7 +342,9 @@ static int sg2_handle_scsi_cmd(cdrom_drive *d, + } + return(0); + } ++#endif + ++#ifdef Linux + static int sgio_handle_scsi_cmd(cdrom_drive *d, + unsigned char *cmd, + unsigned int cmd_len, +@@ -417,7 +429,9 @@ static int sgio_handle_scsi_cmd(cdrom_drive *d, + errno = 0; + return 0; + } ++#endif + +#ifdef Linux static int handle_scsi_cmd(cdrom_drive *d, + unsigned char *cmd, unsigned int cmd_len, - unsigned int in_size, -@@ -284,6 +322,95 @@ static int handle_scsi_cmd(cdrom_drive * - return(0); +@@ -433,6 +447,117 @@ static int handle_scsi_cmd(cdrom_drive *d, + } +#elif defined(__FreeBSD__) +static int handle_scsi_cmd(cdrom_drive *d, -+ unsigned int cmd_len, -+ unsigned int out_size, ++ unsigned char *cmd, ++ unsigned int cmd_len, + unsigned int in_size, ++ unsigned int out_size, + unsigned char bytefill, -+ int bytecheck) { ++ int bytecheck, ++ unsigned char *sense){ + 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); ++ memcpy(d->ccb->csio.cdb_io.cdb_bytes, cmd, cmd_len); + -+ if (bytecheck && out_size == 0) -+ memset(d->sg_buffer, bytefill, in_size); ++ if (bytecheck && in_size == 0) ++ memset(d->private->sg_buffer, bytefill, out_size); + + cam_fill_csio(&d->ccb->csio, + /* retries */ 0, + /* cbfcnp */ NULL, -+ /* flags */ CAM_DEV_QFRZDIS | (out_size ? CAM_DIR_OUT : CAM_DIR_IN), ++ /* flags */ CAM_DEV_QFRZDIS | (in_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, ++ /* data_ptr */ in_size ? cmd + cmd_len : d->private->sg_buffer, + /* dxfer_len */ out_size ? out_size : in_size, + /* sense_len */ SSD_FULL_SIZE, + /* cdb_len */ cmd_len, + /* timeout */ 60000); /* XXX */ + ++ struct timespec tv1, tv2; ++ int tret1=clock_gettime(d->private->clock,&tv1); + if ((result = cam_send_ccb(d->dev, d->ccb)) < 0 || + (d->ccb->ccb_h.status & CAM_STATUS_MASK) == 0 /* hack? */) + return TR_EREAD; ++ int tret2=clock_gettime(d->private->clock,&tv2); + + if ((d->ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP && + (d->ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR) { @@ -121,7 +121,7 @@ + return TR_UNKNOWN; + } + -+ if (d->ccb->csio.dxfer_len != in_size) { ++ if (d->ccb->csio.dxfer_len != out_size) { + errno = EIO; + return TR_EREAD; + } @@ -165,21 +165,72 @@ + break; + } + ++ if(bytecheck && out_size){ ++ long i, flag=0; ++ for(i=in_size;i<out_size;i++) ++ if(d->private->sg_buffer[i]!=bytefill){ ++ flag=1; ++ break; ++ } ++ if(!flag){ ++ errno=EINVAL; ++ return(TR_ILLEGAL); ++ } ++ } ++ ++ if(tret1<0 || tret2<0) ++ d->private->last_milliseconds=-1; ++ else ++ d->private->last_milliseconds = (tv2.tv_sec-tv1.tv_sec)*1000. + (tv2.tv_nsec-tv1.tv_nsec)/1000000.; ++ + return 0; +} +#endif + -+ - /* Group 1 (10b) command */ + static int test_unit_ready(cdrom_drive *d){ + unsigned char sense[SG_MAX_SENSE]; + unsigned char key, ASC, ASCQ; +@@ -453,6 +581,7 @@ static int test_unit_ready(cdrom_drive *d){ + return 1; + } - static int mode_sense_atapi(cdrom_drive *d,int size,int page){ -@@ -833,30 +960,37 @@ static long scsi_read_map (cdrom_drive * - 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; + static void reset_scsi(cdrom_drive *d){ + int arg,tries=0; + d->enable_cdda(d,0); +@@ -472,6 +601,27 @@ static void reset_scsi(cdrom_drive *d){ + 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 ++ + static int mode_sense_atapi(cdrom_drive *d,int size,int page){ + unsigned char sense[SG_MAX_SENSE]; + unsigned char cmd[10]= {0x5A, /* MODE_SENSE */ +@@ -1074,29 +1226,35 @@ static long scsi_read_map (cdrom_drive *d, void *p, lo + + if((err=map(d,(p?buffer:NULL),begin,sectors,sense))){ + if(d->report_all){ ++#ifdef __FreeBSD__ + int error_code, sense_key, asc, ascq; +#endif char b[256]; @@ -194,9 +245,9 @@ +#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])); + (int)(sense[2]&0xf), + (int)(sense[12]), + (int)(sense[13])); +#elif defined(__FreeBSD__) + sense_key, asc, ascq); +#endif @@ -212,23 +263,23 @@ - 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])); +- (int)(sense[2]&0xf), +- (int)(sense[12]), +- (int)(sense[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 @@ static void check_fua_bit(cdrom_drive *d - return; + + switch(errno){ +@@ -1583,6 +1741,7 @@ static void check_cache(cdrom_drive *d){ + } } +#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 @@ static int check_atapi(cdrom_drive *d){ + int fd = d->cdda_fd; /* check the device we'll actually be using to read */ +@@ -1614,6 +1773,53 @@ static int check_atapi(cdrom_drive *d){ } } @@ -280,34 +331,21 @@ +#endif + static int check_mmc(cdrom_drive *d){ - char *b; + unsigned char *b; cdmessage(d,"\nChecking for MMC style command set...\n"); -@@ -1379,6 +1561,7 @@ static void check_exceptions(cdrom_drive +@@ -1660,6 +1866,7 @@ static void check_exceptions(cdrom_drive *d,exception } } +#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 @@ unsigned char *scsi_inquiry(cdrom_drive + unsigned char sense[SG_MAX_SENSE]; +@@ -1671,6 +1878,7 @@ unsigned char *scsi_inquiry(cdrom_drive *d){ } - return (d->sg_buffer); + return (d->private->sg_buffer); } +#endif - int scsi_init_drive(cdrom_drive *d){ -@@ -1458,8 +1642,12 @@ int scsi_init_drive(cdrom_drive *d){ - 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); - } + int ret; |