Commit 40ae7bb1 authored by Anton Blanchard's avatar Anton Blanchard

Merge samba.org:/scratch/anton/linux-2.5

into samba.org:/scratch/anton/tmp3
parents 55d25ac9 da017c5b
......@@ -9,6 +9,10 @@ This driver is known to work with the following cards:
* SA 5i
* SA 532
* SA 5312
* SA 641
* SA 642
* SA 6400
* SA 6400 U320 Expansion Module
If nodes are not already created in the /dev/cciss directory
......
......@@ -90,14 +90,13 @@ static void __init init_amd(struct cpuinfo_x86 *c)
d = d2-d;
/* Knock these two lines out if it debugs out ok */
printk(KERN_INFO "K6 BUG %ld %d (Report these if test report is incorrect)\n", d, 20*K6_BUG_LOOP);
printk(KERN_INFO "AMD K6 stepping B detected - ");
/* -- cut here -- */
if (d > 20*K6_BUG_LOOP)
printk("system stability may be impaired when more than 32 MB are used.\n");
else
printk("probably OK (after B9730xxxx).\n");
printk(KERN_INFO "Please see http://www.mygale.com/~poulot/k6bug.html\n");
printk(KERN_INFO "Please see http://membres.lycos.fr/poulot/k6bug.html\n");
}
/* K6 with old style WHCR */
......
......@@ -100,6 +100,7 @@ static struct _cache_table cache_table[] __initdata =
{ 0x25, LVL_3, 2048 },
{ 0x29, LVL_3, 4096 },
{ 0x39, LVL_2, 128 },
{ 0x3b, LVL_2, 128 },
{ 0x3C, LVL_2, 256 },
{ 0x41, LVL_2, 128 },
{ 0x42, LVL_2, 256 },
......
......@@ -64,6 +64,7 @@ static inline void do_cpuid(int cpu, u32 reg, u32 *data)
{
struct cpuid_command cmd;
preempt_disable();
if ( cpu == smp_processor_id() ) {
cpuid(reg, &data[0], &data[1], &data[2], &data[3]);
} else {
......@@ -73,6 +74,7 @@ static inline void do_cpuid(int cpu, u32 reg, u32 *data)
smp_call_function(cpuid_smp_cpuid, &cmd, 1, 1);
}
preempt_enable();
}
#else /* ! CONFIG_SMP */
......
......@@ -115,9 +115,13 @@ static void msr_smp_rdmsr(void *cmd_block)
static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
{
struct msr_command cmd;
int ret;
preempt_disable();
if ( cpu == smp_processor_id() ) {
return wrmsr_eio(reg, eax, edx);
ret = wrmsr_eio(reg, eax, edx);
preempt_enable();
return ret;
} else {
cmd.cpu = cpu;
cmd.reg = reg;
......@@ -125,6 +129,7 @@ static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
cmd.data[1] = edx;
smp_call_function(msr_smp_wrmsr, &cmd, 1, 1);
preempt_enable();
return cmd.err;
}
}
......
......@@ -419,6 +419,7 @@ static __init int init_k8_gatt(agp_kern_info *info)
panic("Cannot allocate GATT table");
memset(gatt, 0, gatt_size);
change_page_attr(virt_to_page(gatt), gatt_size/PAGE_SIZE, PAGE_KERNEL_NOCACHE);
global_flush_tlb();
agp_gatt_table = gatt;
for_all_nb(dev) {
......
/*
* Disk Array driver for Compaq SMART2 Controllers
* Copyright 2000 Compaq Computer Corporation
* Disk Array driver for HP SA 5xxx and 6xxx Controllers
* Copyright 2000, 2002 Hewlett-Packard Development Company, L.P.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Questions/Comments/Bugfixes to arrays@compaq.com
* Questions/Comments/Bugfixes to Cciss-discuss@lists.sourceforge.net
*
*/
......@@ -69,6 +69,14 @@ const struct pci_device_id cciss_pci_device_id[] = {
0x0E11, 0x4082, 0, 0, 0},
{ PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
0x0E11, 0x4083, 0, 0, 0},
{ PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
0x0E11, 0x409A, 0, 0, 0},
{ PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
0x0E11, 0x409B, 0, 0, 0},
{ PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
0x0E11, 0x409C, 0, 0, 0},
{ PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
0x0E11, 0x409D, 0, 0, 0},
{0,}
};
MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
......@@ -84,6 +92,10 @@ static struct board_type products[] = {
{ 0x40800E11, "Smart Array 5i", &SA5B_access},
{ 0x40820E11, "Smart Array 532", &SA5B_access},
{ 0x40830E11, "Smart Array 5312", &SA5B_access},
{ 0x409A0E11, "Smart Array 641", &SA5_access},
{ 0x409B0E11, "Smart Array 642", &SA5_access},
{ 0x409C0E11, "Smart Array 6400", &SA5_access},
{ 0x409D0E11, "Smart Array 6400 EM", &SA5_access},
};
/* How long to wait (in millesconds) for board to go into simple mode */
......
......@@ -12,7 +12,7 @@ static char rcsid[] =
*
* Initially written by Randolph Bentson <bentson@grieg.seaslug.org>.
* Modified and maintained by Marcio Saito <marcio@cyclades.com>.
* Currently maintained by Henrique Gobbi <henrique.gobbi@cyclades.com>.
* Currently maintained by Ivan Passos <ivan@cyclades.com>.
*
* For Technical support and installation problems, please send e-mail
* to support@cyclades.com.
......@@ -883,7 +883,9 @@ static void cyz_poll(unsigned long);
static long cyz_polling_cycle = CZ_DEF_POLL;
static int cyz_timeron = 0;
static struct timer_list cyz_timerlist = TIMER_INITIALIZER(cyz_poll, 0, 0);
static struct timer_list cyz_timerlist = {
.function = cyz_poll
};
#else /* CONFIG_CYZ_INTR */
static void cyz_rx_restart(unsigned long);
......@@ -4945,7 +4947,7 @@ cy_detect_pci(void)
struct pci_dev *pdev = NULL;
unsigned char cyy_rev_id;
unsigned char cy_pci_irq = 0;
uclong cy_pci_phys0, cy_pci_phys1, cy_pci_phys2;
uclong cy_pci_phys0, cy_pci_phys2;
uclong cy_pci_addr0, cy_pci_addr2;
unsigned short i,j,cy_pci_nchan, plx_ver;
unsigned short device_id,dev_index = 0;
......@@ -4953,8 +4955,7 @@ cy_detect_pci(void)
uclong Ze_addr0[NR_CARDS], Ze_addr2[NR_CARDS], ZeIndex = 0;
uclong Ze_phys0[NR_CARDS], Ze_phys2[NR_CARDS];
unsigned char Ze_irq[NR_CARDS];
struct resource *resource;
unsigned long res_start, res_len;
struct pci_dev *Ze_pdev[NR_CARDS];
for (i = 0; i < NR_CARDS; i++) {
/* look for a Cyclades card by vendor and device id */
......@@ -4976,7 +4977,6 @@ cy_detect_pci(void)
/* read PCI configuration area */
cy_pci_irq = pdev->irq;
cy_pci_phys0 = pci_resource_start(pdev, 0);
cy_pci_phys1 = pci_resource_start(pdev, 1);
cy_pci_phys2 = pci_resource_start(pdev, 2);
pci_read_config_byte(pdev, PCI_REVISION_ID, &cyy_rev_id);
......@@ -5002,15 +5002,10 @@ cy_detect_pci(void)
/* Although we don't use this I/O region, we should
request it from the kernel anyway, to avoid problems
with other drivers accessing it. */
resource = request_region(cy_pci_phys1,
CyPCI_Yctl, "Cyclom-Y");
if (resource == NULL) {
printk(KERN_ERR "cyclades: failed to allocate IO "
"resource at 0x%lx\n", cy_pci_phys1);
if (pci_request_regions(pdev, "Cyclom-Y") != 0) {
printk(KERN_ERR "cyclades: failed to reserve PCI resources\n");
continue;
}
res_start = cy_pci_phys1;
res_len = CyPCI_Yctl;
#if defined(__alpha__)
if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo) { /* below 1M? */
......@@ -5081,10 +5076,7 @@ cy_detect_pci(void)
cy_card[j].bus_index = 1;
cy_card[j].first_line = cy_next_channel;
cy_card[j].num_chips = cy_pci_nchan/4;
cy_card[j].resource = resource;
cy_card[j].res_start = res_start;
cy_card[j].res_len = res_len;
resource = NULL; /* For next card */
cy_card[j].pdev = pdev;
/* enable interrupts in the PCI interface */
plx_ver = cy_readb(cy_pci_addr2 + CyPLX_VER) & 0x0f;
......@@ -5164,15 +5156,10 @@ cy_detect_pci(void)
/* Although we don't use this I/O region, we should
request it from the kernel anyway, to avoid problems
with other drivers accessing it. */
resource = request_region(cy_pci_phys1,
CyPCI_Zctl, "Cyclades-Z");
if (resource == NULL) {
printk(KERN_ERR "cyclades: failed ot allocate IO resource "
"at 0x%lx\n", cy_pci_phys1);
if (pci_request_regions(pdev, "Cyclades-Z") != 0) {
printk(KERN_ERR "cyclades: failed to reserve PCI resources\n");
continue;
}
res_start = cy_pci_phys1;
res_len = CyPCI_Zctl;
if (mailbox == ZE_V1) {
cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ze_win);
......@@ -5187,6 +5174,7 @@ cy_detect_pci(void)
Ze_addr0[ZeIndex] = cy_pci_addr0;
Ze_addr2[ZeIndex] = cy_pci_addr2;
Ze_irq[ZeIndex] = cy_pci_irq;
Ze_pdev[ZeIndex] = pdev;
ZeIndex++;
}
i--;
......@@ -5271,10 +5259,7 @@ cy_detect_pci(void)
cy_card[j].bus_index = 1;
cy_card[j].first_line = cy_next_channel;
cy_card[j].num_chips = -1;
cy_card[j].resource = resource;
cy_card[j].res_start = res_start;
cy_card[j].res_len = res_len;
resource = NULL; /* For next card */
cy_card[j].pdev = pdev;
/* print message */
#ifdef CONFIG_CYZ_INTR
......@@ -5302,12 +5287,14 @@ cy_detect_pci(void)
cy_pci_addr0 = Ze_addr0[0];
cy_pci_addr2 = Ze_addr2[0];
cy_pci_irq = Ze_irq[0];
pdev = Ze_pdev[0];
for (j = 0 ; j < ZeIndex-1 ; j++) {
Ze_phys0[j] = Ze_phys0[j+1];
Ze_phys2[j] = Ze_phys2[j+1];
Ze_addr0[j] = Ze_addr0[j+1];
Ze_addr2[j] = Ze_addr2[j+1];
Ze_irq[j] = Ze_irq[j+1];
Ze_pdev[j] = Ze_pdev[j+1];
}
ZeIndex--;
mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *)
......@@ -5365,6 +5352,7 @@ cy_detect_pci(void)
cy_card[j].bus_index = 1;
cy_card[j].first_line = cy_next_channel;
cy_card[j].num_chips = -1;
cy_card[j].pdev = pdev;
/* print message */
#ifdef CONFIG_CYZ_INTR
......@@ -5797,8 +5785,8 @@ cy_cleanup_module(void)
#endif /* CONFIG_CYZ_INTR */
)
free_irq(cy_card[i].irq, &cy_card[i]);
if (cy_card[i].resource)
release_region(cy_card[i].res_start, cy_card[i].res_len);
if (cy_card[i].pdev)
pci_release_regions(cy_card[i].pdev);
}
}
if (tmp_buf) {
......
......@@ -581,8 +581,10 @@ static int __init drm_init( void )
init_timer( &dev->timer );
init_waitqueue_head( &dev->context_wait );
if ((DRM(minor)[i] = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0)
return -EPERM;
if ((DRM(minor)[i] = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0) {
retcode = -EPERM;
goto fail_reg;
}
dev->device = MKDEV(DRM_MAJOR, DRM(minor)[i] );
dev->name = DRIVER_NAME;
......@@ -591,9 +593,8 @@ static int __init drm_init( void )
#if __MUST_HAVE_AGP
if ( dev->agp == NULL ) {
DRM_ERROR( "Cannot initialize the agpgart module.\n" );
DRM(stub_unregister)(DRM(minor)[i]);
DRM(takedown)( dev );
return -ENOMEM;
retcode = -ENOMEM;
goto fail;
}
#endif
#if __REALLY_HAVE_MTRR
......@@ -609,9 +610,7 @@ static int __init drm_init( void )
retcode = DRM(ctxbitmap_init)( dev );
if( retcode ) {
DRM_ERROR( "Cannot allocate memory for context bitmap.\n" );
DRM(stub_unregister)(DRM(minor)[i]);
DRM(takedown)( dev );
return retcode;
goto fail;
}
#endif
DRM_INFO( "Initialized %s %d.%d.%d %s on minor %d\n",
......@@ -626,6 +625,15 @@ static int __init drm_init( void )
DRIVER_POSTINIT();
return 0;
fail:
DRM(stub_unregister)(DRM(minor)[i]);
DRM(takedown)( dev );
fail_reg:
kfree (DRM(device));
kfree (DRM(minor));
return retcode;
}
/* drm_cleanup is called via cleanup_module at module unload time.
......
......@@ -1749,8 +1749,8 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
/*
* pad, if necessary
*/
if (len) {
while (len) {
if (len > 0) {
while (len > 0) {
int pad = 0;
xferfunc(drive, &pad, sizeof(pad));
......
......@@ -12,7 +12,7 @@
static unsigned long eeprom_addr;
static long long eisa_eeprom_llseek(struct file *file, loff_t offset, int origin )
static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin )
{
switch (origin) {
case 0:
......
......@@ -4911,6 +4911,8 @@
0100 Lava Dual Serial
0101 Lava Quatro A
0102 Lava Quatro B
0180 Lava Octo A
0181 Lava Octo B
0200 Lava Port Plus
0201 Lava Quad A
0202 Lava Quad B
......
......@@ -719,6 +719,7 @@ static struct pci_fixup pci_fixups[] __devinitdata = {
* instead of 0x01.
*/
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82380FB, quirk_transparent_bridge },
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_TOSHIBA, 0x605, quirk_transparent_bridge },
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master },
......
/* $Id: riowatchdog.c,v 1.3 2001/10/08 22:19:51 davem Exp $
/* $Id: riowatchdog.c,v 1.3.2.2 2002/01/23 18:48:02 davem Exp $
* riowatchdog.c - driver for hw watchdog inside Super I/O of RIO
*
* Copyright (C) 2001 David S. Miller (davem@redhat.com)
......@@ -127,8 +127,11 @@ static int riowd_release(struct inode *inode, struct file *filp)
static int riowd_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
static struct watchdog_info info = { 0, 0, "Natl. Semiconductor PC97317" };
static struct watchdog_info info = {
WDIOF_SETTIMEOUT, 0, "Natl. Semiconductor PC97317"
};
unsigned int options;
int new_margin;
switch (cmd) {
case WDIOC_GETSUPPORT:
......@@ -159,6 +162,18 @@ static int riowd_ioctl(struct inode *inode, struct file *filp,
break;
case WDIOC_SETTIMEOUT:
if (get_user(new_margin, (int *)arg))
return -EFAULT;
if ((new_margin < 60) || (new_margin > (255 * 60)))
return -EINVAL;
riowd_timeout = (new_margin + 59) / 60;
riowd_pingtimer();
/* Fall */
case WDIOC_GETTIMEOUT:
return put_user(riowd_timeout * 60, (int *)arg);
default:
return -EINVAL;
};
......
......@@ -193,7 +193,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
#define SCSI_LOG_HLCOMPLETE_BITS 3
#define SCSI_LOG_IOCTL_BITS 3
#if CONFIG_SCSI_LOGGING
#ifdef CONFIG_SCSI_LOGGING
#define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD) \
{ \
......
......@@ -897,6 +897,7 @@ enum pci_board_num_t {
pbn_b0_bt_1_460800,
pbn_b0_bt_2_460800,
pbn_b0_bt_4_460800,
pbn_b0_bt_1_921600,
pbn_b0_bt_2_921600,
......@@ -1039,6 +1040,12 @@ static struct pci_board pci_boards[] __devinitdata = {
.base_baud = 460800,
.uart_offset = 8,
},
[pbn_b0_bt_4_460800] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 4,
.base_baud = 460800,
.uart_offset = 8,
},
[pbn_b0_bt_1_921600] = {
.flags = FL_BASE0|FL_BASE_BARS,
......@@ -1928,6 +1935,12 @@ static struct pci_device_id serial_pci_tbl[] __devinitdata = {
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_B,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_bt_2_115200 },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_OCTO_A,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_bt_4_460800 },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_OCTO_B,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_bt_4_460800 },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_PLUS,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_bt_2_460800 },
......
......@@ -186,8 +186,6 @@ static void usblp_dump(struct usblp *usblp) {
}
#endif
extern devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */
/* Quirks: various printer quirks are handled by this table & its flags. */
struct quirk_printer_struct {
......@@ -820,7 +818,7 @@ static int usblp_probe(struct usb_interface *intf,
struct usblp *usblp = 0;
int protocol;
int retval;
char name[6];
char name[10];
/* Malloc and start initializing usblp structure so we can use it
* directly. */
......@@ -909,8 +907,8 @@ static int usblp_probe(struct usb_interface *intf,
#endif
/* If we have devfs, create with perms=660. */
sprintf(name, "lp%d", usblp->minor);
usblp->devfs = devfs_register(usb_devfs_handle, name,
sprintf(name, "usb/lp%d", usblp->minor);
usblp->devfs = devfs_register(NULL, name,
DEVFS_FL_DEFAULT, USB_MAJOR,
usblp->minor,
S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |
......
......@@ -28,8 +28,7 @@
#endif
#include <linux/usb.h>
devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */
EXPORT_SYMBOL(usb_devfs_handle);
static devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */
#define MAX_USB_MINORS 256
static struct file_operations *usb_minors[MAX_USB_MINORS];
......
......@@ -878,7 +878,7 @@ probe_scanner(struct usb_interface *intf,
char valid_device = 0;
char have_bulk_in, have_bulk_out, have_intr;
char name[10];
char name[14];
dbg("probe_scanner: USB dev address:%p", dev);
......@@ -1099,9 +1099,9 @@ probe_scanner(struct usb_interface *intf,
scn->scn_minor = scn_minor;
scn->isopen = 0;
sprintf(name, "scanner%d", scn->scn_minor - SCN_BASE_MNR);
sprintf(name, "usb/scanner%d", scn->scn_minor - SCN_BASE_MNR);
scn->devfs = devfs_register(usb_devfs_handle, name,
scn->devfs = devfs_register(NULL, name,
DEVFS_FL_DEFAULT, USB_MAJOR,
scn->scn_minor,
S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |
......
......@@ -352,6 +352,4 @@ struct scn_usb_data {
};
#define to_scanner(d) container_of(d, struct scn_usb_data, kobj)
extern devfs_handle_t usb_devfs_handle;
static struct usb_driver scanner_driver;
......@@ -72,9 +72,6 @@ do { \
#endif
/* prefix for the device descriptors in /dev/usb */
#define AU_PREFIX "auer"
/* Number of read buffers for each device */
#define AU_RBUFFERS 10
......@@ -243,7 +240,7 @@ typedef struct auerscon
typedef struct
{
struct semaphore mutex; /* protection in user context */
char name[16]; /* name of the /dev/usb entry */
char name[20]; /* name of the /dev/usb entry */
unsigned int dtindex; /* index in the device table */
devfs_handle_t devfs; /* devfs device node */
struct usb_device * usbdev; /* USB device handle */
......@@ -260,9 +257,6 @@ typedef struct
wait_queue_head_t bufferwait; /* wait for a control buffer */
} auerswald_t,*pauerswald_t;
/* the global usb devfs handle */
extern devfs_handle_t usb_devfs_handle;
/* array of pointers to our devices that are currently connected */
static pauerswald_t dev_table[AUER_MAX_DEVICES];
......@@ -1440,7 +1434,7 @@ static int auerchar_open (struct inode *inode, struct file *file)
cp->open_count++;
ccp->auerdev = cp;
dbg("open %s as /dev/usb/%s", cp->dev_desc, cp->name);
dbg("open %s as /dev/%s", cp->dev_desc, cp->name);
up (&cp->mutex);
/* file IO stuff */
......@@ -1970,7 +1964,7 @@ static int auerswald_probe (struct usb_interface *intf,
}
/* Give the device a name */
sprintf (cp->name, AU_PREFIX "%d", dtindex);
sprintf (cp->name, "usb/auer%d", dtindex);
/* Store the index */
cp->dtindex = dtindex;
......@@ -1978,8 +1972,7 @@ static int auerswald_probe (struct usb_interface *intf,
up (&dev_table_mutex);
/* initialize the devfs node for this device and register it */
cp->devfs = devfs_register (usb_devfs_handle, cp->name,
DEVFS_FL_DEFAULT, USB_MAJOR,
cp->devfs = devfs_register(NULL, cp->name, 0, USB_MAJOR,
AUER_MINOR_BASE + dtindex,
S_IFCHR | S_IRUGO | S_IWUGO,
&auerswald_fops, NULL);
......@@ -2089,7 +2082,7 @@ static void auerswald_disconnect (struct usb_interface *intf)
return;
down (&cp->mutex);
info ("device /dev/usb/%s now disconnecting", cp->name);
info ("device /dev/%s now disconnecting", cp->name);
/* remove from device table */
/* Nobody can open() this device any more */
......
......@@ -144,8 +144,6 @@ static int mycontrolmsg(const char *funcname,
#define rcvcontrolmsg(priv,a,b,c,d,e,f) \
controlmsg(priv, USB_DIR_IN, a,b,c,d,e,f)
extern devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */
/* ----------------------------------------------------------------------- */
/* Data */
......@@ -294,7 +292,7 @@ brlvger_probe (struct usb_interface *intf,
/* protects against reentrance: once we've found a free slot
we reserve it.*/
static DECLARE_MUTEX(reserve_sem);
char devfs_name[16];
char devfs_name[20];
actifsettings = dev->actconfig->interface->altsetting;
......@@ -375,8 +373,8 @@ brlvger_probe (struct usb_interface *intf,
};
dbg("Display length: %d", priv->plength);
sprintf(devfs_name, "brlvger%d", priv->subminor);
priv->devfs = devfs_register(usb_devfs_handle, devfs_name,
sprintf(devfs_name, "usb/brlvger%d", priv->subminor);
priv->devfs = devfs_register(NULL, devfs_name,
DEVFS_FL_DEFAULT, USB_MAJOR,
BRLVGER_MINOR+priv->subminor,
S_IFCHR |S_IRUSR|S_IWUSR |S_IRGRP|S_IWGRP,
......
......@@ -76,8 +76,6 @@ struct rio_usb_data {
struct semaphore lock; /* general race avoidance */
};
extern devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */
static struct rio_usb_data rio_instance;
static int open_rio(struct inode *inode, struct file *file)
......@@ -478,7 +476,7 @@ static int probe_rio(struct usb_interface *intf,
}
dbg("probe_rio: ibuf address:%p", rio->ibuf);
rio->devfs = devfs_register(usb_devfs_handle, "rio500",
rio->devfs = devfs_register(NULL, "usb/rio500",
DEVFS_FL_DEFAULT, USB_MAJOR,
RIO_MINOR,
S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |
......
......@@ -107,7 +107,6 @@ struct rtl8150 {
typedef struct rtl8150 rtl8150_t;
/* the global usb devfs handle */
extern devfs_handle_t usb_devfs_handle;
unsigned long multicast_filter_limit = 32;
static void fill_skb_pool(rtl8150_t *);
......
......@@ -119,9 +119,6 @@ struct usb_skel {
};
/* the global usb devfs handle */
extern devfs_handle_t usb_devfs_handle;
/* prevent races between open() and disconnect() */
static DECLARE_MUTEX (disconnect_sem);
......@@ -514,7 +511,7 @@ static int skel_probe(struct usb_interface *interface, const struct usb_device_i
size_t buffer_size;
int i;
int retval;
char name[10];
char name[14];
/* See if the device offered us matches what we can accept */
......@@ -609,9 +606,9 @@ static int skel_probe(struct usb_interface *interface, const struct usb_device_i
}
/* initialize the devfs node for this device and register it */
sprintf(name, "skel%d", dev->minor);
sprintf(name, "usb/skel%d", dev->minor);
dev->devfs = devfs_register (usb_devfs_handle, name,
dev->devfs = devfs_register(NULL, name,
DEVFS_FL_DEFAULT, USB_MAJOR,
dev->minor,
S_IFCHR | S_IRUSR | S_IWUSR |
......
......@@ -51,6 +51,7 @@ static struct inode *get_cramfs_inode(struct super_block *sb, struct cramfs_inod
inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
inode->i_blksize = PAGE_CACHE_SIZE;
inode->i_gid = cramfs_inode->gid;
inode->i_mtime = inode->i_atime = inode->i_ctime = 0;
inode->i_ino = CRAMINO(cramfs_inode);
/* inode->i_nlink is left 1 - arguably wrong for directories,
but it's the best we can do without reading the directory
......
......@@ -784,7 +784,8 @@ struct dentry * d_alloc_root(struct inode * root_inode)
struct dentry *res = NULL;
if (root_inode) {
res = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 });
static const struct qstr name = { .name = "/", .len = 1, .hash = 0 };
res = d_alloc(NULL, &name);
if (res) {
res->d_sb = root_inode->i_sb;
res->d_parent = res;
......@@ -994,13 +995,13 @@ struct dentry * d_lookup(struct dentry * parent, struct qstr * name)
/*
* If dentry is moved, fail the lookup
*/
if (unlikely(move_count != dentry->d_move_count))
break;
if (likely(move_count == dentry->d_move_count)) {
if (!d_unhashed(dentry)) {
atomic_inc(&dentry->d_count);
dentry->d_vfs_flags |= DCACHE_REFERENCED;
found = dentry;
}
}
spin_unlock(&dentry->d_lock);
break;
}
......
......@@ -70,6 +70,7 @@
#include <linux/devfs_fs_kernel.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/genhd.h>
#include <asm/bitops.h>
#include "internal.h"
......@@ -266,6 +267,18 @@ void devfs_dealloc_devnum(umode_t mode, dev_t devnum)
up(&device_list_mutex);
}
struct unique_numspace
{
spinlock_t init_lock;
unsigned char sem_initialised;
unsigned int num_free; /* Num free in bits */
unsigned int length; /* Array length in bytes */
unsigned long *bits;
struct semaphore semaphore;
};
#define UNIQUE_NUMBERSPACE_INITIALISER {SPIN_LOCK_UNLOCKED, 0, 0, 0, NULL}
/**
* devfs_alloc_unique_number - Allocate a unique (positive) number.
......@@ -339,3 +352,82 @@ void devfs_dealloc_unique_number (struct unique_numspace *space, int number)
if (!was_set) PRINTK ("(): number %d was already free\n", number);
} /* End Function devfs_dealloc_unique_number */
EXPORT_SYMBOL(devfs_dealloc_unique_number);
static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
static struct unique_numspace cdrom_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
void devfs_create_partitions(struct gendisk *dev)
{
int pos = 0;
devfs_handle_t dir;
char dirname[64], symlink[16];
if (dev->flags & GENHD_FL_DEVFS) {
dir = dev->de;
if (!dir) /* Aware driver wants to block disc management */
return;
pos = devfs_generate_path(dir, dirname + 3, sizeof dirname-3);
if (pos < 0)
return;
strncpy(dirname + pos, "../", 3);
} else {
/* Unaware driver: construct "real" directory */
sprintf(dirname, "../%s/disc%d", dev->disk_name,
dev->first_minor >> dev->minor_shift);
dir = devfs_mk_dir(dirname + 3);
dev->de = dir;
}
dev->number = devfs_alloc_unique_number (&disc_numspace);
sprintf(symlink, "discs/disc%d", dev->number);
devfs_mk_symlink(symlink, dirname + pos);
dev->disk_de = devfs_register(dir, "disc", 0,
dev->major, dev->first_minor,
S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL);
}
void devfs_create_cdrom(struct gendisk *dev)
{
char vname[23];
dev->number = devfs_alloc_unique_number(&cdrom_numspace);
sprintf(vname, "cdroms/cdrom%d", dev->number);
if (dev->de) {
int pos;
char rname[64];
dev->disk_de = devfs_register(dev->de, "cd", DEVFS_FL_DEFAULT,
dev->major, dev->first_minor,
S_IFBLK | S_IRUGO | S_IWUGO,
dev->fops, NULL);
pos = devfs_generate_path(dev->disk_de, rname+3, sizeof(rname)-3);
if (pos >= 0) {
strncpy(rname + pos, "../", 3);
devfs_mk_symlink(vname, rname + pos);
}
} else {
dev->disk_de = devfs_register (NULL, vname, DEVFS_FL_DEFAULT,
dev->major, dev->first_minor,
S_IFBLK | S_IRUGO | S_IWUGO,
dev->fops, NULL);
}
}
void devfs_remove_partitions(struct gendisk *dev)
{
devfs_unregister(dev->disk_de);
dev->disk_de = NULL;
if (dev->flags & GENHD_FL_CD) {
if (dev->de)
devfs_remove("cdroms/cdrom%d", dev->number);
devfs_dealloc_unique_number(&cdrom_numspace, dev->number);
} else {
devfs_remove("discs/disc%d", dev->number);
if (!(dev->flags & GENHD_FL_DEVFS)) {
devfs_unregister(dev->de);
dev->de = NULL;
}
devfs_dealloc_unique_number(&disc_numspace, dev->number);
}
}
......@@ -176,93 +176,6 @@ static void devfs_register_partition(struct gendisk *dev, int part)
#endif
}
#ifdef CONFIG_DEVFS_FS
static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
static struct unique_numspace cdrom_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
#endif
static void devfs_create_partitions(struct gendisk *dev)
{
#ifdef CONFIG_DEVFS_FS
int pos = 0;
devfs_handle_t dir;
char dirname[64], symlink[16];
if (dev->flags & GENHD_FL_DEVFS) {
dir = dev->de;
if (!dir) /* Aware driver wants to block disc management */
return;
pos = devfs_generate_path(dir, dirname + 3, sizeof dirname-3);
if (pos < 0)
return;
strncpy(dirname + pos, "../", 3);
} else {
/* Unaware driver: construct "real" directory */
sprintf(dirname, "../%s/disc%d", dev->disk_name,
dev->first_minor >> dev->minor_shift);
dir = devfs_mk_dir(dirname + 3);
dev->de = dir;
}
dev->number = devfs_alloc_unique_number (&disc_numspace);
sprintf(symlink, "discs/disc%d", dev->number);
devfs_mk_symlink(symlink, dirname + pos);
dev->disk_de = devfs_register(dir, "disc", 0,
dev->major, dev->first_minor,
S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL);
#endif
}
static void devfs_create_cdrom(struct gendisk *dev)
{
#ifdef CONFIG_DEVFS_FS
char vname[23];
dev->number = devfs_alloc_unique_number(&cdrom_numspace);
sprintf(vname, "cdroms/cdrom%d", dev->number);
if (dev->de) {
int pos;
char rname[64];
dev->disk_de = devfs_register(dev->de, "cd", DEVFS_FL_DEFAULT,
dev->major, dev->first_minor,
S_IFBLK | S_IRUGO | S_IWUGO,
dev->fops, NULL);
pos = devfs_generate_path(dev->disk_de, rname+3, sizeof(rname)-3);
if (pos >= 0) {
strncpy(rname + pos, "../", 3);
devfs_mk_symlink(vname, rname + pos);
}
} else {
dev->disk_de = devfs_register (NULL, vname, DEVFS_FL_DEFAULT,
dev->major, dev->first_minor,
S_IFBLK | S_IRUGO | S_IWUGO,
dev->fops, NULL);
}
#endif
}
static void devfs_remove_partitions(struct gendisk *dev)
{
#ifdef CONFIG_DEVFS_FS
devfs_unregister(dev->disk_de);
dev->disk_de = NULL;
if (dev->flags & GENHD_FL_CD) {
if (dev->de)
devfs_remove("cdroms/cdrom%d", dev->number);
devfs_dealloc_unique_number(&cdrom_numspace, dev->number);
} else {
devfs_remove("discs/disc%d", dev->number);
if (!(dev->flags & GENHD_FL_DEVFS)) {
devfs_unregister(dev->de);
dev->de = NULL;
}
devfs_dealloc_unique_number(&disc_numspace, dev->number);
}
#endif
}
/*
* sysfs bindings for partitions
*/
......@@ -522,6 +435,7 @@ char *partition_name(dev_t dev)
{
struct gendisk *hd;
static char nomem [] = "<nomem>";
char b[BDEVNAME_SIZE];
struct dev_name *dname;
struct list_head *tmp;
int part;
......@@ -547,7 +461,7 @@ char *partition_name(dev_t dev)
put_disk(hd);
}
if (!dname->name) {
sprintf(dname->namebuf, "[dev %s]", kdevname(to_kdev_t(dev)));
sprintf(dname->namebuf, "[dev %s]", __bdevname(dev, b));
dname->name = dname->namebuf;
}
......
......@@ -458,7 +458,7 @@ static __inline__ int ffs(int x)
__asm__("bsfl %1,%0\n\t"
"jnz 1f\n\t"
"movl $-1,%0\n"
"1:" : "=r" (r) : "g" (x));
"1:" : "=r" (r) : "rm" (x));
return r+1;
}
......
......@@ -49,7 +49,7 @@
* Temporary debugging check to catch old code using
* unmapped ISA addresses. Will be removed in 2.4.
*/
#if CONFIG_DEBUG_IOVIRT
#ifdef CONFIG_DEBUG_IOVIRT
extern void *__io_virt_debug(unsigned long x, const char *file, int line);
#define __io_virt(x) __io_virt_debug((unsigned long)(x), __FILE__, __LINE__)
#else
......
......@@ -419,7 +419,7 @@ static inline void load_esp0(struct tss_struct *tss, unsigned long esp0)
{
tss->esp0 = esp0;
/* This can only happen when SEP is enabled, no need to test "SEP"arately */
if (tss->ss1 != __KERNEL_CS) {
if ((unlikely(tss->ss1 != __KERNEL_CS))) {
tss->ss1 = __KERNEL_CS;
wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
}
......
......@@ -114,7 +114,7 @@ typedef u32 compat_uptr_t;
static inline void *compat_ptr(compat_uptr_t uptr)
{
return (void *)uptr;
return (void *)(unsigned long)uptr;
}
#endif /* _ASM_PARISC_COMPAT_H */
......@@ -108,7 +108,7 @@ typedef u32 compat_uptr_t;
static inline void *compat_ptr(compat_uptr_t uptr)
{
return (void *)uptr;
return (void *)(unsigned long)uptr;
}
#endif /* _ASM_PPC64_COMPAT_H */
......@@ -111,7 +111,7 @@ typedef u32 compat_uptr_t;
static inline void *compat_ptr(compat_uptr_t uptr)
{
return (void *)(uptr & 0x7fffffffUL);
return (void *)(unsigned long)(uptr & 0x7fffffffUL);
}
#endif /* _ASM_S390X_COMPAT_H */
......@@ -117,7 +117,7 @@ typedef u32 compat_uptr_t;
static inline void *compat_ptr(compat_uptr_t uptr)
{
return (void *)uptr;
return (void *)(unsigned long)uptr;
}
#endif /* _ASM_X86_64_COMPAT_H */
......@@ -515,9 +515,7 @@ struct cyclades_card {
int nports; /* Number of ports in the card */
int bus_index; /* address shift - 0 for ISA, 1 for PCI */
int intr_enabled; /* FW Interrupt flag - 0 disabled, 1 enabled */
struct resource *resource;
unsigned long res_start;
unsigned long res_len;
struct pci_dev *pdev;
#ifdef __KERNEL__
spinlock_t card_lock;
#else
......
......@@ -20,20 +20,9 @@
typedef struct devfs_entry * devfs_handle_t;
#ifdef CONFIG_DEVFS_FS
struct unique_numspace
{
spinlock_t init_lock;
unsigned char sem_initialised;
unsigned int num_free; /* Num free in bits */
unsigned int length; /* Array length in bytes */
unsigned long *bits;
struct semaphore semaphore;
};
#define UNIQUE_NUMBERSPACE_INITIALISER {SPIN_LOCK_UNLOCKED, 0, 0, 0, NULL}
struct gendisk;
#ifdef CONFIG_DEVFS_FS
extern devfs_handle_t devfs_register (devfs_handle_t dir, const char *name,
unsigned int flags,
unsigned int major, unsigned int minor,
......@@ -47,21 +36,11 @@ extern void devfs_remove(const char *fmt, ...)
extern int devfs_generate_path (devfs_handle_t de, char *path, int buflen);
extern int devfs_register_tape (devfs_handle_t de);
extern void devfs_unregister_tape(int num);
extern int devfs_alloc_unique_number (struct unique_numspace *space);
extern void devfs_dealloc_unique_number (struct unique_numspace *space,
int number);
extern void devfs_create_partitions(struct gendisk *dev);
extern void devfs_create_cdrom(struct gendisk *dev);
extern void devfs_remove_partitions(struct gendisk *dev);
extern void mount_devfs_fs (void);
#else /* CONFIG_DEVFS_FS */
struct unique_numspace
{
char dummy;
};
#define UNIQUE_NUMBERSPACE_INITIALISER {0}
static inline devfs_handle_t devfs_register (devfs_handle_t dir,
const char *name,
unsigned int flags,
......@@ -99,14 +78,14 @@ static inline int devfs_register_tape (devfs_handle_t de)
static inline void devfs_unregister_tape(int num)
{
}
static inline int devfs_alloc_unique_number (struct unique_numspace *space)
static inline void devfs_create_partitions(struct gendisk *dev)
{
return -1;
}
static inline void devfs_dealloc_unique_number (struct unique_numspace *space,
int number)
static inline void devfs_create_cdrom(struct gendisk *dev)
{
}
static inline void devfs_remove_partitions(struct gendisk *dev)
{
return;
}
static inline void mount_devfs_fs (void)
{
......
......@@ -397,6 +397,8 @@
#define PCI_DEVICE_ID_IBM_MPIC 0x0046
#define PCI_DEVICE_ID_IBM_3780IDSP 0x007d
#define PCI_DEVICE_ID_IBM_CHUKAR 0x0096
#define PCI_DEVICE_ID_IBM_CPC710_PCI64 0x00fc
#define PCI_DEVICE_ID_IBM_CPC710_PCI32 0x0105
#define PCI_DEVICE_ID_IBM_405GP 0x0156
#define PCI_DEVICE_ID_IBM_SERVERAIDI960 0x01bd
#define PCI_DEVICE_ID_IBM_MPIC_2 0xffff
......@@ -1248,6 +1250,7 @@
#define PCI_DEVICE_ID_SERVERWORKS_LE 0x0009
#define PCI_DEVICE_ID_SERVERWORKS_CIOB30 0x0010
#define PCI_DEVICE_ID_SERVERWORKS_CMIC_HE 0x0011
#define PCI_DEVICE_ID_SERVERWORKS_GCNB_LE 0x0017
#define PCI_DEVICE_ID_SERVERWORKS_OSB4 0x0200
#define PCI_DEVICE_ID_SERVERWORKS_CSB5 0x0201
#define PCI_DEVICE_ID_SERVERWORKS_CSB6 0x0203
......@@ -1257,6 +1260,9 @@
#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217
#define PCI_DEVICE_ID_SERVERWORKS_OSB4USB 0x0220
#define PCI_DEVICE_ID_SERVERWORKS_CSB5USB PCI_DEVICE_ID_SERVERWORKS_OSB4USB
#define PCI_DEVICE_ID_SERVERWORKS_CSB6USB 0x0221
#define PCI_DEVICE_ID_SERVERWORKS_GCLE 0x0225
#define PCI_DEVICE_ID_SERVERWORKS_GCLE2 0x0227
#define PCI_DEVICE_ID_SERVERWORKS_CSB5ISA 0x0230
#define PCI_VENDOR_ID_SBE 0x1176
......@@ -1759,6 +1765,9 @@
#define PCI_DEVICE_ID_S3_ViRGE_MXPMV 0x8c03
#define PCI_DEVICE_ID_S3_SONICVIBES 0xca00
#define PCI_VENDOR_ID_DUNORD 0x5544
#define PCI_DEVICE_ID_DUNORD_I3000 0x0001
#define PCI_VENDOR_ID_DCI 0x6666
#define PCI_DEVICE_ID_DCI_PCCOM4 0x0001
#define PCI_DEVICE_ID_DCI_PCCOM8 0x0002
......
......@@ -836,8 +836,7 @@ struct dn_fib_table *dn_fib_get_table(int n, int create)
return NULL;
if (in_interrupt() && net_ratelimit()) {
printk(KERN_DEBUG "DECnet: BUG! Attempt to create routing table
from interrupt\n");
printk(KERN_DEBUG "DECnet: BUG! Attempt to create routing table from interrupt\n");
return NULL;
}
if ((t = kmalloc(sizeof(struct dn_fib_table), GFP_KERNEL)) == NULL)
......
......@@ -1111,7 +1111,7 @@ static int __ipv6_regen_rndid(struct inet6_dev *idev)
if (time_before(idev->regen_timer.expires, jiffies)) {
idev->regen_timer.expires = 0;
printk(KERN_WARNING
"__ipv6_regen_rndid(): too short regeneration interval; timer diabled for %s.\n",
"__ipv6_regen_rndid(): too short regeneration interval; timer disabled for %s.\n",
idev->dev->name);
in6_dev_put(idev);
return -1;
......
......@@ -34,6 +34,8 @@
* anyway.
*
* Changes
* John Rood Added Bose Sound System Support.
* Toshio Spoor
* Alan Cox Modularisation, Basic cleanups.
* Paul Barton-Davis Separated MPU configuration, added
* Tropez+ (WaveFront) support
......@@ -58,6 +60,10 @@
#define KEY_PORT 0x279 /* Same as LPT1 status port */
#define CSN_NUM 0x99 /* Just a random number */
#define INDEX_ADDRESS 0x00 /* (R0) Index Address Register */
#define INDEX_DATA 0x01 /* (R1) Indexed Data Register */
#define PIN_CONTROL 0x0a /* (I10) Pin Control */
#define ENABLE_PINS 0xc0 /* XCTRL0/XCTRL1 enable */
static void CS_OUT(unsigned char a)
{
......@@ -67,6 +73,7 @@ static void CS_OUT(unsigned char a)
#define CS_OUT2(a, b) {CS_OUT(a);CS_OUT(b);}
#define CS_OUT3(a, b, c) {CS_OUT(a);CS_OUT(b);CS_OUT(c);}
static int __initdata bss = 0;
static int mpu_base = 0, mpu_irq = 0;
static int synth_base = 0, synth_irq = 0;
static int mpu_detected = 0;
......@@ -97,7 +104,31 @@ static void sleep(unsigned howlong)
schedule_timeout(howlong);
}
int probe_cs4232(struct address_info *hw_config, int isapnp_configured)
static void enable_xctrl(int baseio)
{
unsigned char regd;
/*
* Some IBM Aptiva's have the Bose Sound System. By default
* the Bose Amplifier is disabled. The amplifier will be
* activated, by setting the XCTRL0 and XCTRL1 bits.
* Volume of the monitor bose speakers/woofer, can then
* be set by changing the PCM volume.
*
*/
printk("cs4232: enabling Bose Sound System Amplifier.\n");
/* Switch to Pin Control Address */
regd = inb(baseio + INDEX_ADDRESS) & 0xe0;
outb(((unsigned char) (PIN_CONTROL | regd)), baseio + INDEX_ADDRESS );
/* Activate the XCTRL0 and XCTRL1 Pins */
regd = inb(baseio + INDEX_DATA);
outb(((unsigned char) (ENABLE_PINS | regd)), baseio + INDEX_DATA );
}
int __init probe_cs4232(struct address_info *hw_config, int isapnp_configured)
{
int i, n;
int base = hw_config->io_base, irq = hw_config->irq;
......@@ -218,7 +249,7 @@ int probe_cs4232(struct address_info *hw_config, int isapnp_configured)
return 0;
}
void attach_cs4232(struct address_info *hw_config)
void __init attach_cs4232(struct address_info *hw_config)
{
int base = hw_config->io_base,
irq = hw_config->irq,
......@@ -275,9 +306,14 @@ void attach_cs4232(struct address_info *hw_config)
}
hw_config->slots[1] = hw_config2.slots[1];
}
if (bss)
{
enable_xctrl(base);
}
}
static void unload_cs4232(struct address_info *hw_config)
static void __exit unload_cs4232(struct address_info *hw_config)
{
int base = hw_config->io_base, irq = hw_config->irq;
int dma1 = hw_config->dma, dma2 = hw_config->dma2;
......@@ -349,6 +385,8 @@ MODULE_PARM(synthirq,"i");
MODULE_PARM_DESC(synthirq,"Maui WaveTable IRQ");
MODULE_PARM(isapnp,"i");
MODULE_PARM_DESC(isapnp,"Enable ISAPnP probing (default 1)");
MODULE_PARM(bss,"i");
MODULE_PARM_DESC(bss,"Enable Bose Sound System Support (default 0)");
/*
* Install a CS4232 based card. Need to have ad1848 and mpu401
......
......@@ -408,14 +408,17 @@ static void copy_block(void **dst, u32 str, u8 *src, u32 len)
if (len > PAGE_SIZE - pgoff) {
k = PAGE_SIZE - pgoff;
__copy_from_user((u8 *)dst[pg] + pgoff, src, k);
if (__copy_from_user((u8 *)dst[pg] + pgoff, src, k))
return;
len -= k;
while (len > PAGE_SIZE) {
__copy_from_user(dst[++pg], src + k, PAGE_SIZE);
if (__copy_from_user(dst[++pg], src + k, PAGE_SIZE))
return;
k += PAGE_SIZE;
len -= PAGE_SIZE;
}
__copy_from_user(dst[++pg], src + k, len);
if (__copy_from_user(dst[++pg], src + k, len))
return;
} else
__copy_from_user((u8 *)dst[pg] + pgoff, src, len);
......@@ -440,7 +443,8 @@ static void copy_ilv_block(struct woinst *woinst, u32 str, u8 *src, u32 len)
while (len) {
for (voice_num = 0; voice_num < woinst->num_voices; voice_num++) {
__copy_from_user((u8 *)(voice[voice_num].mem.addr[pg]) + pgoff, src, woinst->format.bytespervoicesample);
if (__copy_from_user((u8 *)(voice[voice_num].mem.addr[pg]) + pgoff, src, woinst->format.bytespervoicesample))
return -EFAULT;
src += woinst->format.bytespervoicesample;
}
......
......@@ -365,6 +365,8 @@ static int __init init_c930(struct address_info *hw_config)
{
unsigned char cfg = 0;
cfg |= (0x0f & mad16_conf);
if(c931_detected)
{
/* Bit 0 has reversd meaning. Bits 1 and 2 sese
......@@ -402,7 +404,10 @@ static int __init init_c930(struct address_info *hw_config)
and the C931. */
cfg = c931_detected ? 0x04 : 0x00;
mad_write(MC4_PORT, 0x52|cfg);
if(mad16_cdsel & 0x20)
mad_write(MC4_PORT, 0x62|cfg); /* opl4 */
else
mad_write(MC4_PORT, 0x52|cfg); /* opl3 */
mad_write(MC5_PORT, 0x3C); /* Init it into mode2 */
mad_write(MC6_PORT, 0x02); /* Enable WSS, Disable MPU and SB */
......@@ -529,10 +534,12 @@ static int __init probe_mad16(struct address_info *hw_config)
return init_c930(hw_config);
for (i = 0xf8d; i <= 0xf93; i++)
for (i = 0xf8d; i <= 0xf93; i++) {
if (!c924pnp)
DDB(printk("port %03x = %02x\n", i, mad_read(i))) else
DDB(printk("port %03x = %02x\n", i, mad_read(i)))
else
DDB(printk("port %03x = %02x\n", i-0x80, mad_read(i)));
}
/*
* Set the WSS address
......@@ -559,10 +566,10 @@ static int __init probe_mad16(struct address_info *hw_config)
*/
tmp &= ~0x0f;
tmp |= (mad16_conf & 0x0f); /* CD-ROM and joystick bits */
mad_write(MC1_PORT, tmp);
tmp = mad_read(MC2_PORT);
tmp = mad16_cdsel;
mad_write(MC2_PORT, tmp);
mad_write(MC3_PORT, 0xf0); /* Disable SB */
......@@ -590,9 +597,12 @@ static int __init probe_mad16(struct address_info *hw_config)
mad_write(MC5_PORT, 0x30 | cs4231_mode);
}
for (i = 0xf8d; i <= 0xf93; i++) if (!c924pnp)
DDB(printk("port %03x after init = %02x\n", i, mad_read(i))) else
for (i = 0xf8d; i <= 0xf93; i++) {
if (!c924pnp)
DDB(printk("port %03x after init = %02x\n", i, mad_read(i)))
else
DDB(printk("port %03x after init = %02x\n", i-0x80, mad_read(i)));
}
wss_init(hw_config);
return 1;
......@@ -879,7 +889,7 @@ static int __initdata cdirq = 0;
static int __initdata cdport = 0x340;
static int __initdata cddma = -1;
static int __initdata opl4 = 0;
static int __initdata joystick = 1;
static int __initdata joystick = 0;
MODULE_PARM(mpu_io, "i");
MODULE_PARM(mpu_irq, "i");
......@@ -1049,6 +1059,12 @@ static void __exit cleanup_mad16(void)
{
if (found_mpu)
unload_mad16_mpu(&cfg_mpu);
if (gameport.io) {
/* the gameport was initialized so we must free it up */
gameport_unregister_port(&gameport);
gameport.io = 0;
release_region(0x201, 1);
}
unload_mad16(&cfg);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment