summaryrefslogtreecommitdiff
path: root/audio/cdparanoia/files/patch-interface_scsi__interface.c
diff options
context:
space:
mode:
authorTobias Rehbein <tobias.rehbein@web.de>2024-07-04 06:24:52 +0000
committerAlexey Dokuchaev <danfe@FreeBSD.org>2024-07-04 06:24:52 +0000
commitd0b1d9ec73207ca2400394af1db811ddcf3d2759 (patch)
treea2baeeddc17afba8863fb57cbd5447857222321f /audio/cdparanoia/files/patch-interface_scsi__interface.c
parentsysutils/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.c238
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;