summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroger <roger@FreeBSD.org>1999-04-29 05:48:32 +0000
committerroger <roger@FreeBSD.org>1999-04-29 05:48:32 +0000
commitaf9af01d52c73ef1cbb86e61ad970ce266e4f52b (patch)
treefbdbbbad64c7655fe20cce2d7c6f6ca9a5ca0c7e
parenta71077fa5c7b9f5688d8aed793f912fc32e377e9 (diff)
downloadFreeBSD-src-af9af01d52c73ef1cbb86e61ad970ce266e4f52b.zip
FreeBSD-src-af9af01d52c73ef1cbb86e61ad970ce266e4f52b.tar.gz
Fix crashes caused by rows=0 or columns=0.
Add new #ifdef. By defining BKTR_NO_MSP_RESET you can prevent the MSP34xx being reset by the bt848 driver. This is handy if you pre-initialise the MSP34xx stereo audio chip in another operating system first (eg MS Windows). Suggested by: Randal Hopper<aa8vb@ipass.net> Suggested by: Yuri Gindin <yuri@xpert.com>
-rw-r--r--sys/dev/bktr/bktr_core.c51
-rw-r--r--sys/pci/brooktree848.c51
2 files changed, 90 insertions, 12 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index eb622c2..de116cc 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -1,4 +1,4 @@
-/* $Id: brooktree848.c,v 1.68 1999/04/24 20:13:58 peter Exp $ */
+/* $Id: brooktree848.c,v 1.69 1999/04/28 10:54:06 dt Exp $ */
/* BT848 Driver for Brooktree's Bt848, Bt849, Bt878 and Bt 879 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
@@ -354,6 +354,13 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
Added for Jan Schmidt <mmedia@rz.uni-greifswald.de>
Added ALPS Tuner Type from Hiroki Mori <mori@infocity.co.jp>
+1.61 29 Apr 1999 Roger Hardiman <roger@freebsd.org>
+ Fix row=0/columns=0 bug. From Randal Hopper<aa8vb@ipass.net>
+ Add option to block the reset of the MSP34xx audio chip by
+ adding options BKTR_NO_MSP_RESET to the kernel config file.
+ This is usefull if you run another operating system
+ first to initialise the audio chip, then do a soft reboot.
+ Added for Yuri Gindin <yuri@xpert.com>
*/
#define DDB(x) x
@@ -2465,13 +2472,25 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
else
bktr->flags &= ~METEOR_ONLY_EVEN_FIELDS;
- if ((geo->columns & 0x3fe) != geo->columns) {
+ if (geo->columns <= 0) {
+ printf(
+ "bktr%d: ioctl: %d: columns must be greater than zero.\n",
+ unit, geo->columns);
+ error = EINVAL;
+ }
+ else if ((geo->columns & 0x3fe) != geo->columns) {
printf(
"bktr%d: ioctl: %d: columns too large or not even.\n",
unit, geo->columns);
error = EINVAL;
}
- if (((geo->rows & 0x7fe) != geo->rows) ||
+ if (geo->rows <= 0) {
+ printf(
+ "bktr%d: ioctl: %d: rows must be greater than zero.\n",
+ unit, geo->rows);
+ error = EINVAL;
+ }
+ else if (((geo->rows & 0x7fe) != geo->rows) ||
((geo->oformat & METEOR_GEO_FIELD_MASK) &&
((geo->rows & 0x3fe) != geo->rows)) ) {
printf(
@@ -4462,9 +4481,14 @@ msp_read(bktr_ptr_t bktr, unsigned char dev, unsigned int addr)
}
/* Reset the MSP chip */
+/* The user can block the reset (which is handy if you initialise the
+ * MSP audio in another operating system first (eg in Windows)
+ */
static void
msp_reset( bktr_ptr_t bktr )
{
+
+#ifndef BKTR_NO_MSP_RESET
/* put into reset mode */
iicbus_start(IICBUS(bktr), MSP3400C_WADDR, 0 /* no timeout? */);
iicbus_write_byte(IICBUS(bktr), 0x00, 0);
@@ -4478,7 +4502,7 @@ msp_reset( bktr_ptr_t bktr )
iicbus_write_byte(IICBUS(bktr), 0x00, 0);
iicbus_write_byte(IICBUS(bktr), 0x00, 0);
iicbus_stop(IICBUS(bktr));
-
+#endif
return;
}
@@ -4725,8 +4749,12 @@ static unsigned int msp_read(bktr_ptr_t bktr, unsigned char dev, unsigned int ad
}
/* Reset the MSP chip */
+/* The user can block the reset (which is handy if you initialise the
+ * MSP audio in another operating system first (eg in Windows)
+ */
static void msp_reset( bktr_ptr_t bktr ) {
+#ifndef BKTR_NO_MSP_RESET
/* put into reset mode */
i2c_start(bktr);
i2c_write_byte(bktr, MSP3400C_WADDR);
@@ -4742,6 +4770,8 @@ static void msp_reset( bktr_ptr_t bktr ) {
i2c_write_byte(bktr, 0x00);
i2c_write_byte(bktr, 0x00);
i2c_stop(bktr);
+#endif
+ return;
}
@@ -5316,9 +5346,17 @@ checkDBX:
checkMSP:
/* If this is a Hauppauge Bt878 card, we need to enable the
* MSP 34xx audio chip.
- * The chip's reset line is wired to GPIO pin 5 and a pulldown
- * resistor holds the device in reset until we set GPIO pin 5
+ * If this is a Hauppauge Bt848 card, reset the MSP device.
+ * The MSP reset line is wired to GPIO pin 5. On Bt878 cards a pulldown
+ * resistor holds the device in reset until we set GPIO pin 5.
*/
+
+ /* Optionally skip the MSP reset. This is handy if you initialise the
+ * MSP audio in another operating system (eg Windows) first and then
+ * do a soft reboot.
+ */
+
+#ifndef BKTR_NO_MSP_RESET
if (card == CARD_HAUPPAUGE) {
bt848->gpio_out_en = bt848->gpio_out_en | (1<<5);
bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
@@ -5328,6 +5366,7 @@ checkMSP:
bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
DELAY(2500); /* wait 2.5ms */
}
+#endif
#if defined( OVERRIDE_MSP )
bktr->card.msp3400c = OVERRIDE_MSP;
diff --git a/sys/pci/brooktree848.c b/sys/pci/brooktree848.c
index eb622c2..de116cc 100644
--- a/sys/pci/brooktree848.c
+++ b/sys/pci/brooktree848.c
@@ -1,4 +1,4 @@
-/* $Id: brooktree848.c,v 1.68 1999/04/24 20:13:58 peter Exp $ */
+/* $Id: brooktree848.c,v 1.69 1999/04/28 10:54:06 dt Exp $ */
/* BT848 Driver for Brooktree's Bt848, Bt849, Bt878 and Bt 879 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
@@ -354,6 +354,13 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
Added for Jan Schmidt <mmedia@rz.uni-greifswald.de>
Added ALPS Tuner Type from Hiroki Mori <mori@infocity.co.jp>
+1.61 29 Apr 1999 Roger Hardiman <roger@freebsd.org>
+ Fix row=0/columns=0 bug. From Randal Hopper<aa8vb@ipass.net>
+ Add option to block the reset of the MSP34xx audio chip by
+ adding options BKTR_NO_MSP_RESET to the kernel config file.
+ This is usefull if you run another operating system
+ first to initialise the audio chip, then do a soft reboot.
+ Added for Yuri Gindin <yuri@xpert.com>
*/
#define DDB(x) x
@@ -2465,13 +2472,25 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
else
bktr->flags &= ~METEOR_ONLY_EVEN_FIELDS;
- if ((geo->columns & 0x3fe) != geo->columns) {
+ if (geo->columns <= 0) {
+ printf(
+ "bktr%d: ioctl: %d: columns must be greater than zero.\n",
+ unit, geo->columns);
+ error = EINVAL;
+ }
+ else if ((geo->columns & 0x3fe) != geo->columns) {
printf(
"bktr%d: ioctl: %d: columns too large or not even.\n",
unit, geo->columns);
error = EINVAL;
}
- if (((geo->rows & 0x7fe) != geo->rows) ||
+ if (geo->rows <= 0) {
+ printf(
+ "bktr%d: ioctl: %d: rows must be greater than zero.\n",
+ unit, geo->rows);
+ error = EINVAL;
+ }
+ else if (((geo->rows & 0x7fe) != geo->rows) ||
((geo->oformat & METEOR_GEO_FIELD_MASK) &&
((geo->rows & 0x3fe) != geo->rows)) ) {
printf(
@@ -4462,9 +4481,14 @@ msp_read(bktr_ptr_t bktr, unsigned char dev, unsigned int addr)
}
/* Reset the MSP chip */
+/* The user can block the reset (which is handy if you initialise the
+ * MSP audio in another operating system first (eg in Windows)
+ */
static void
msp_reset( bktr_ptr_t bktr )
{
+
+#ifndef BKTR_NO_MSP_RESET
/* put into reset mode */
iicbus_start(IICBUS(bktr), MSP3400C_WADDR, 0 /* no timeout? */);
iicbus_write_byte(IICBUS(bktr), 0x00, 0);
@@ -4478,7 +4502,7 @@ msp_reset( bktr_ptr_t bktr )
iicbus_write_byte(IICBUS(bktr), 0x00, 0);
iicbus_write_byte(IICBUS(bktr), 0x00, 0);
iicbus_stop(IICBUS(bktr));
-
+#endif
return;
}
@@ -4725,8 +4749,12 @@ static unsigned int msp_read(bktr_ptr_t bktr, unsigned char dev, unsigned int ad
}
/* Reset the MSP chip */
+/* The user can block the reset (which is handy if you initialise the
+ * MSP audio in another operating system first (eg in Windows)
+ */
static void msp_reset( bktr_ptr_t bktr ) {
+#ifndef BKTR_NO_MSP_RESET
/* put into reset mode */
i2c_start(bktr);
i2c_write_byte(bktr, MSP3400C_WADDR);
@@ -4742,6 +4770,8 @@ static void msp_reset( bktr_ptr_t bktr ) {
i2c_write_byte(bktr, 0x00);
i2c_write_byte(bktr, 0x00);
i2c_stop(bktr);
+#endif
+ return;
}
@@ -5316,9 +5346,17 @@ checkDBX:
checkMSP:
/* If this is a Hauppauge Bt878 card, we need to enable the
* MSP 34xx audio chip.
- * The chip's reset line is wired to GPIO pin 5 and a pulldown
- * resistor holds the device in reset until we set GPIO pin 5
+ * If this is a Hauppauge Bt848 card, reset the MSP device.
+ * The MSP reset line is wired to GPIO pin 5. On Bt878 cards a pulldown
+ * resistor holds the device in reset until we set GPIO pin 5.
*/
+
+ /* Optionally skip the MSP reset. This is handy if you initialise the
+ * MSP audio in another operating system (eg Windows) first and then
+ * do a soft reboot.
+ */
+
+#ifndef BKTR_NO_MSP_RESET
if (card == CARD_HAUPPAUGE) {
bt848->gpio_out_en = bt848->gpio_out_en | (1<<5);
bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
@@ -5328,6 +5366,7 @@ checkMSP:
bt848->gpio_data = bt848->gpio_data | (1<<5); /* write '1' */
DELAY(2500); /* wait 2.5ms */
}
+#endif
#if defined( OVERRIDE_MSP )
bktr->card.msp3400c = OVERRIDE_MSP;
OpenPOWER on IntegriCloud