CVS commit: [netbsd-5] src/sys/dev/scsipi

2012-10-31 Thread Jeff Rizzo
Module Name:src
Committed By:   riz
Date:   Wed Oct 31 15:17:53 UTC 2012

Modified Files:
src/sys/dev/scsipi [netbsd-5]: sd.c

Log Message:
sys/dev/scsipi/sd.c patch

Allow disk strategy to be queried and changed at runtime
for sd(4) disks.
[buhrow, ticket #1807]


To generate a diff of this commit:
cvs rdiff -u -r1.275 -r1.275.4.1 src/sys/dev/scsipi/sd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/scsipi/sd.c
diff -u src/sys/dev/scsipi/sd.c:1.275 src/sys/dev/scsipi/sd.c:1.275.4.1
--- src/sys/dev/scsipi/sd.c:1.275	Wed Jul 16 18:54:09 2008
+++ src/sys/dev/scsipi/sd.c	Wed Oct 31 15:17:53 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: sd.c,v 1.275 2008/07/16 18:54:09 drochner Exp $	*/
+/*	$NetBSD: sd.c,v 1.275.4.1 2012/10/31 15:17:53 riz Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: sd.c,v 1.275 2008/07/16 18:54:09 drochner Exp $);
+__KERNEL_RCSID(0, $NetBSD: sd.c,v 1.275.4.1 2012/10/31 15:17:53 riz Exp $);
 
 #include opt_scsi.h
 #include rnd.h
@@ -1003,7 +1003,7 @@ sdioctl(dev_t dev, u_long cmd, void *add
 	struct sd_softc *sd = device_lookup_private(sd_cd, SDUNIT(dev));
 	struct scsipi_periph *periph = sd-sc_periph;
 	int part = SDPART(dev);
-	int error = 0;
+	int error = 0, s;
 #ifdef __HAVE_OLD_DISKLABEL
 	struct disklabel *newlabel = NULL;
 #endif
@@ -1027,6 +1027,8 @@ sdioctl(dev_t dev, u_long cmd, void *add
 		case OSCIOCIDENTIFY:
 		case SCIOCCOMMAND:
 		case SCIOCDEBUG:
+		case DIOCGSTRATEGY:
+		case DIOCSSTRATEGY:
 			if (part == RAW_PART)
 break;
 		/* FALLTHROUGH */
@@ -1237,6 +1239,47 @@ sdioctl(dev_t dev, u_long cmd, void *add
 		return (dkwedge_list(sd-sc_dk, dkwl, l));
 	}
 
+	case DIOCGSTRATEGY:
+	{
+		struct disk_strategy *dks = (void *)addr;
+
+		s = splbio();
+		strlcpy(dks-dks_name, bufq_getstrategyname(sd-buf_queue),
+		sizeof(dks-dks_name));
+		splx(s);
+		dks-dks_paramlen = 0;
+
+		return 0;
+	}
+	
+	case DIOCSSTRATEGY:
+	{
+		struct disk_strategy *dks = (void *)addr;
+		struct bufq_state *new;
+		struct bufq_state *old;
+
+		if ((flag  FWRITE) == 0) {
+			return EBADF;
+		}
+		if (dks-dks_param != NULL) {
+			return EINVAL;
+		}
+		dks-dks_name[sizeof(dks-dks_name) - 1] = 0; /* ensure term */
+		error = bufq_alloc(new, dks-dks_name,
+		BUFQ_EXACT|BUFQ_SORT_RAWBLOCK);
+		if (error) {
+			return error;
+		}
+		s = splbio();
+		old = sd-buf_queue;
+		bufq_move(new, old);
+		sd-buf_queue = new;
+		splx(s);
+		bufq_free(old);
+
+		return 0;
+	}
+
 	default:
 		if (part != RAW_PART)
 			return (ENOTTY);



CVS commit: [netbsd-5] src/sys/dev/scsipi

2009-04-08 Thread Soren Jacobsen
Module Name:src
Committed By:   snj
Date:   Wed Apr  8 23:02:16 UTC 2009

Modified Files:
src/sys/dev/scsipi [netbsd-5]: cd.c scsipi_cd.h

Log Message:
Pull up following revision(s) (requested by reinoud in ticket #633):
sys/dev/scsipi/cd.c: revision 1.291
sys/dev/scsipi/scsipi_cd.h: revision 1.21
Implement MMC_TRACKINFO_DATA and MMC_TRACKINFO_AUDIO detection for cdrom and
dvdrom devices. These two compatibility codes were forgotten when those were
introduced.


To generate a diff of this commit:
cvs rdiff -u -r1.283.4.1 -r1.283.4.2 src/sys/dev/scsipi/cd.c
cvs rdiff -u -r1.20 -r1.20.4.1 src/sys/dev/scsipi/scsipi_cd.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/scsipi/cd.c
diff -u src/sys/dev/scsipi/cd.c:1.283.4.1 src/sys/dev/scsipi/cd.c:1.283.4.2
--- src/sys/dev/scsipi/cd.c:1.283.4.1	Tue Mar 24 20:16:58 2009
+++ src/sys/dev/scsipi/cd.c	Wed Apr  8 23:02:15 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: cd.c,v 1.283.4.1 2009/03/24 20:16:58 snj Exp $	*/
+/*	$NetBSD: cd.c,v 1.283.4.2 2009/04/08 23:02:15 snj Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001, 2003, 2004, 2005, 2008 The NetBSD Foundation,
@@ -50,7 +50,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: cd.c,v 1.283.4.1 2009/03/24 20:16:58 snj Exp $);
+__KERNEL_RCSID(0, $NetBSD: cd.c,v 1.283.4.2 2009/04/08 23:02:15 snj Exp $);
 
 #include rnd.h
 
@@ -3174,7 +3174,7 @@
 	const uint32_t buffer_size = 4 * 1024;	/* worst case TOC estimate */
 	uint8_t *buffer;
 	uint8_t track_sessionnr, last_tracknr, sessionnr, adr, tno, point;
-	uint8_t tmin, tsec, tframe, pmin, psec, pframe;
+	uint8_t control, tmin, tsec, tframe, pmin, psec, pframe;
 	int size, req_size;
 	int error, flags;
 
@@ -3218,6 +3218,7 @@
 
 	/* read in complete raw toc */
 	req_size = _2btol(toc_hdr-length);
+	req_size = 2*((req_size + 1) / 2);	/* for ATAPI */
 	_lto2b(req_size, gtoc_cmd.data_len);
 
 	error = scsipi_command(periph,
@@ -3248,6 +3249,7 @@
 		tno   = rawtoc-tno;
 		sessionnr = rawtoc-sessionnr;
 		adr   = rawtoc-adrcontrol  4;
+		control   = rawtoc-adrcontrol  0xf;
 		point = rawtoc-point;
 		tmin  = rawtoc-min;
 		tsec  = rawtoc-sec;
@@ -3285,6 +3287,14 @@
 			}
 		}
 
+		if ((control  (32)) == 4)		/* 01xxb */
+			flags |= MMC_TRACKINFO_DATA;
+		if ((control  (12)) == 0) {		/* x0xxb */
+			flags |= MMC_TRACKINFO_AUDIO;
+			if (control  1)		/* xxx1b */
+flags |= MMC_TRACKINFO_PRE_EMPH;
+		}
+
 		rawtoc++;
 		size -= sizeof(struct scsipi_toc_rawtoc);
 	}
@@ -3344,7 +3354,7 @@
 	uint32_t lba, lead_out;
 	const uint32_t buffer_size = 4 * 1024;	/* worst case TOC estimate */
 	uint8_t *buffer;
-	uint8_t last_tracknr;
+	uint8_t control, last_tracknr;
 	int size, req_size;
 	int error, flags;
 
@@ -3410,12 +3420,15 @@
 	track_start  = 0;
 	track_size   = 0;
 	lead_out = 0;
+	flags= 0;
 
 	size = req_size - sizeof(struct scsipi_toc_header) + 1;
 	while (size  0) {
 		/* remember, DVD-ROM: tracknr == sessionnr */
 		lba = _4btol(toc-msf_lba);
 		tracknr = toc-tracknr;
+		control = toc-adrcontrol  0xf;
+
 		if (trackinfo-tracknr == tracknr) {
 			track_start = lba;
 		}
@@ -3426,6 +3439,17 @@
 		if (tracknr == 0xAA) {
 			lead_out = lba;
 		}
+
+		if ((control  (32)) == 4)		/* 01xxb */
+			flags |= MMC_TRACKINFO_DATA;
+		if ((control  (12)) == 0) {		/* x0xxb */
+			flags |= MMC_TRACKINFO_AUDIO;
+			if (control  (13))		/* 10xxb */
+flags |= MMC_TRACKINFO_AUDIO_4CHAN;
+			if (control  1)		/* xxx1b */
+flags |= MMC_TRACKINFO_PRE_EMPH;
+		}
+
 		toc++;
 		size -= sizeof(struct scsipi_toc_formatted);
 	}
@@ -3439,7 +3463,7 @@
 	trackinfo-track_mode = 0;	/* unknown */
 	trackinfo-data_mode  = 8;	/* 2048 bytes mode1   */
 
-	trackinfo-flags = 0;
+	trackinfo-flags = flags;
 	trackinfo-track_start   = track_start;
 	trackinfo-next_writable = 0;
 	trackinfo-free_blocks   = 0;

Index: src/sys/dev/scsipi/scsipi_cd.h
diff -u src/sys/dev/scsipi/scsipi_cd.h:1.20 src/sys/dev/scsipi/scsipi_cd.h:1.20.4.1
--- src/sys/dev/scsipi/scsipi_cd.h:1.20	Mon Sep  8 23:36:54 2008
+++ src/sys/dev/scsipi/scsipi_cd.h	Wed Apr  8 23:02:15 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsipi_cd.h,v 1.20 2008/09/08 23:36:54 gmcgarry Exp $	*/
+/*	$NetBSD: scsipi_cd.h,v 1.20.4.1 2009/04/08 23:02:15 snj Exp $	*/
 
 /*
  * Written by Julian Elischer (jul...@tfs.com)
@@ -115,7 +115,7 @@
 /* read TOC form 0 result entries */
 struct scsipi_toc_formatted {
 	uint8_t  unused1;
-	uint8_t  adrcontol;
+	uint8_t  adrcontrol;
 	uint8_t  tracknr;
 	uint8_t  unused2;
 	uint8_t	 msf_lba[4];		/* union msf_lba from cdio.h */