Commit 31893c62 authored by David S. Miller's avatar David S. Miller

Merge nuts.davemloft.net:/disk1/BK/sparcwork-2.6

into nuts.davemloft.net:/disk1/BK/sparc-2.6
parents a53bc753 0242b389
...@@ -1492,22 +1492,22 @@ BEGIN_FTR_SECTION ...@@ -1492,22 +1492,22 @@ BEGIN_FTR_SECTION
* seems that doesn't affect our ability to actually * seems that doesn't affect our ability to actually
* write to these SPRs. * write to these SPRs.
*/ */
mtspr SPRN_DBAT4U,r20 mtspr SPRN_DBAT4U,r10
mtspr SPRN_DBAT4L,r20 mtspr SPRN_DBAT4L,r10
mtspr SPRN_DBAT5U,r20 mtspr SPRN_DBAT5U,r10
mtspr SPRN_DBAT5L,r20 mtspr SPRN_DBAT5L,r10
mtspr SPRN_DBAT6U,r20 mtspr SPRN_DBAT6U,r10
mtspr SPRN_DBAT6L,r20 mtspr SPRN_DBAT6L,r10
mtspr SPRN_DBAT7U,r20 mtspr SPRN_DBAT7U,r10
mtspr SPRN_DBAT7L,r20 mtspr SPRN_DBAT7L,r10
mtspr SPRN_IBAT4U,r20 mtspr SPRN_IBAT4U,r10
mtspr SPRN_IBAT4L,r20 mtspr SPRN_IBAT4L,r10
mtspr SPRN_IBAT5U,r20 mtspr SPRN_IBAT5U,r10
mtspr SPRN_IBAT5L,r20 mtspr SPRN_IBAT5L,r10
mtspr SPRN_IBAT6U,r20 mtspr SPRN_IBAT6U,r10
mtspr SPRN_IBAT6L,r20 mtspr SPRN_IBAT6L,r10
mtspr SPRN_IBAT7U,r20 mtspr SPRN_IBAT7U,r10
mtspr SPRN_IBAT7L,r20 mtspr SPRN_IBAT7L,r10
END_FTR_SECTION_IFSET(CPU_FTR_HAS_HIGH_BATS) END_FTR_SECTION_IFSET(CPU_FTR_HAS_HIGH_BATS)
blr blr
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
* *
* $Id: hci_usb.c,v 1.8 2002/07/18 17:23:09 maxk Exp $ * $Id: hci_usb.c,v 1.8 2002/07/18 17:23:09 maxk Exp $
*/ */
#define VERSION "2.4" #define VERSION "2.5"
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -70,12 +70,6 @@ ...@@ -70,12 +70,6 @@
static struct usb_driver hci_usb_driver; static struct usb_driver hci_usb_driver;
static struct usb_device_id bluetooth_ids[] = { static struct usb_device_id bluetooth_ids[] = {
/* Broadcom BCM2033 without firmware */
{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE },
/* Digianswer device */
{ USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
/* Generic Bluetooth USB device */ /* Generic Bluetooth USB device */
{ USB_DEVICE_INFO(HCI_DEV_CLASS, HCI_DEV_SUBCLASS, HCI_DEV_PROTOCOL) }, { USB_DEVICE_INFO(HCI_DEV_CLASS, HCI_DEV_SUBCLASS, HCI_DEV_PROTOCOL) },
...@@ -93,6 +87,19 @@ static struct usb_device_id bluetooth_ids[] = { ...@@ -93,6 +87,19 @@ static struct usb_device_id bluetooth_ids[] = {
MODULE_DEVICE_TABLE (usb, bluetooth_ids); MODULE_DEVICE_TABLE (usb, bluetooth_ids);
static struct usb_device_id blacklist_ids[] = {
/* Broadcom BCM2033 without firmware */
{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE },
/* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = HCI_RESET },
/* Digianswer device */
{ USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
{ } /* Terminating entry */
};
struct _urb *_urb_alloc(int isoc, int gfp) struct _urb *_urb_alloc(int isoc, int gfp)
{ {
struct _urb *_urb = kmalloc(sizeof(struct _urb) + struct _urb *_urb = kmalloc(sizeof(struct _urb) +
...@@ -644,7 +651,7 @@ static inline int __recv_frame(struct hci_usb *husb, int type, void *data, int c ...@@ -644,7 +651,7 @@ static inline int __recv_frame(struct hci_usb *husb, int type, void *data, int c
#endif #endif
} }
BT_DBG("new packet len %d", len); BT_DBG("new packet len %d", len);
skb = bt_skb_alloc(len, GFP_ATOMIC); skb = bt_skb_alloc(len, GFP_ATOMIC);
if (!skb) { if (!skb) {
BT_ERR("%s no memory for the packet", husb->hdev->name); BT_ERR("%s no memory for the packet", husb->hdev->name);
...@@ -790,6 +797,13 @@ int hci_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -790,6 +797,13 @@ int hci_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
BT_DBG("udev %p ifnum %d", udev, ifnum); BT_DBG("udev %p ifnum %d", udev, ifnum);
if (!id->driver_info) {
const struct usb_device_id *match;
match = usb_match_id(intf, blacklist_ids);
if (match)
id = match;
}
iface = udev->actconfig->interface[0]; iface = udev->actconfig->interface[0];
if (id->driver_info & HCI_IGNORE) if (id->driver_info & HCI_IGNORE)
...@@ -928,6 +942,9 @@ int hci_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -928,6 +942,9 @@ int hci_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
hdev->owner = THIS_MODULE; hdev->owner = THIS_MODULE;
if (id->driver_info & HCI_RESET)
set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks);
if (hci_register_dev(hdev) < 0) { if (hci_register_dev(hdev) < 0) {
BT_ERR("Can't register HCI device"); BT_ERR("Can't register HCI device");
hci_free_dev(hdev); hci_free_dev(hdev);
...@@ -994,6 +1011,6 @@ void hci_usb_cleanup(void) ...@@ -994,6 +1011,6 @@ void hci_usb_cleanup(void)
module_init(hci_usb_init); module_init(hci_usb_init);
module_exit(hci_usb_cleanup); module_exit(hci_usb_cleanup);
MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>"); MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION); MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -38,7 +38,8 @@ ...@@ -38,7 +38,8 @@
#define HCI_DIGI_REQ 0x40 #define HCI_DIGI_REQ 0x40
#define HCI_IGNORE 0x01 #define HCI_IGNORE 0x01
#define HCI_DIGIANSWER 0x02 #define HCI_RESET 0x02
#define HCI_DIGIANSWER 0x04
#define HCI_MAX_IFACE_NUM 3 #define HCI_MAX_IFACE_NUM 3
......
...@@ -5601,6 +5601,8 @@ ...@@ -5601,6 +5601,8 @@
14da National Aerospace Laboratories 14da National Aerospace Laboratories
14db AFAVLAB Technology Inc 14db AFAVLAB Technology Inc
2120 TK9902 2120 TK9902
2180 P028
2182 P030
14dc Amplicon Liveline Ltd 14dc Amplicon Liveline Ltd
0000 PCI230 0000 PCI230
0001 PCI242 0001 PCI242
......
...@@ -16,12 +16,8 @@ ...@@ -16,12 +16,8 @@
* *
* A note about mapbase / membase * A note about mapbase / membase
* *
* mapbase is the physical address of the IO port. Currently, we don't * mapbase is the physical address of the IO port.
* support this very well, and it may well be dropped from this driver * membase is an 'ioremapped' cookie.
* in future. As such, mapbase should be NULL.
*
* membase is an 'ioremapped' cookie. This is compatible with the old
* serial.c driver, and is currently the preferred form.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -1976,7 +1972,7 @@ static int __init serial8250_console_setup(struct console *co, char *options) ...@@ -1976,7 +1972,7 @@ static int __init serial8250_console_setup(struct console *co, char *options)
if (co->index >= UART_NR) if (co->index >= UART_NR)
co->index = 0; co->index = 0;
port = &serial8250_ports[co->index].port; port = &serial8250_ports[co->index].port;
if (port->type == PORT_UNKNOWN) if (!port->ops)
return -ENODEV; return -ENODEV;
/* /*
......
...@@ -145,8 +145,10 @@ afavlab_setup(struct pci_dev *dev, struct pci_board *board, ...@@ -145,8 +145,10 @@ afavlab_setup(struct pci_dev *dev, struct pci_board *board,
bar = FL_GET_BASE(board->flags); bar = FL_GET_BASE(board->flags);
if (idx < 4) if (idx < 4)
bar += idx; bar += idx;
else else {
bar = 4;
offset += (idx - 4) * board->uart_offset; offset += (idx - 4) * board->uart_offset;
}
return setup_port(dev, req, bar, offset, board->reg_shift); return setup_port(dev, req, bar, offset, board->reg_shift);
} }
...@@ -1772,7 +1774,7 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -1772,7 +1774,7 @@ static struct pci_device_id serial_pci_tbl[] = {
pbn_b0_4_115200 }, pbn_b0_4_115200 },
{ PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952, { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_2_115200 }, pbn_b0_bt_2_921600 },
/* /*
* Digitan DS560-558, from jimd@esoft.com * Digitan DS560-558, from jimd@esoft.com
...@@ -1891,6 +1893,9 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -1891,6 +1893,9 @@ static struct pci_device_id serial_pci_tbl[] = {
{ PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P028, { PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P028,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_bt_8_115200 }, pbn_b0_bt_8_115200 },
{ PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P030,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_bt_8_115200 },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DSERIAL, { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DSERIAL,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
......
...@@ -250,12 +250,6 @@ config SERIAL_CLPS711X_CONSOLE ...@@ -250,12 +250,6 @@ config SERIAL_CLPS711X_CONSOLE
your boot loader (lilo or loadlin) about how to pass options to the your boot loader (lilo or loadlin) about how to pass options to the
kernel at boot time.) kernel at boot time.)
config SERIAL_CLPS711X_OLD_NAME
bool "Use the old 2.4 names for CLPS711X serial port"
depends on SERIAL_CLPS711X=y
help
::: To be written :::
config SERIAL_DZ config SERIAL_DZ
bool "DECstation DZ serial driver" bool "DECstation DZ serial driver"
depends on DECSTATION depends on DECSTATION
......
...@@ -49,19 +49,10 @@ ...@@ -49,19 +49,10 @@
#define UART_NR 2 #define UART_NR 2
#ifndef CONFIG_SERIAL_CLPS711X_OLD_NAME
#define SERIAL_CLPS711X_MAJOR 204 #define SERIAL_CLPS711X_MAJOR 204
#define SERIAL_CLPS711X_MINOR 40 #define SERIAL_CLPS711X_MINOR 40
#define SERIAL_CLPS711X_NR UART_NR #define SERIAL_CLPS711X_NR UART_NR
#else
#warning The old names/device number for this driver if compatabity is needed
#define SERIAL_CLPS711X_MAJOR 204
#define SERIAL_CLPS711X_MINOR 16
#define SERIAL_CLPS711X_NR UART_NR
#endif
/* /*
* We use the relevant SYSCON register as a base address for these ports. * We use the relevant SYSCON register as a base address for these ports.
*/ */
......
...@@ -175,8 +175,6 @@ static int uart_startup(struct uart_state *state, int init_hw) ...@@ -175,8 +175,6 @@ static int uart_startup(struct uart_state *state, int init_hw)
uart_circ_clear(&info->xmit); uart_circ_clear(&info->xmit);
} }
port->mctrl = 0;
retval = port->ops->startup(port); retval = port->ops->startup(port);
if (retval == 0) { if (retval == 0) {
if (init_hw) { if (init_hw) {
...@@ -1874,9 +1872,6 @@ uart_set_options(struct uart_port *port, struct console *co, ...@@ -1874,9 +1872,6 @@ uart_set_options(struct uart_port *port, struct console *co,
if (flow == 'r') if (flow == 'r')
termios.c_cflag |= CRTSCTS; termios.c_cflag |= CRTSCTS;
if (!port->ops)
return 0; /* "console=" on ia64 */
port->ops->set_termios(port, &termios, NULL); port->ops->set_termios(port, &termios, NULL);
co->cflag = termios.c_cflag; co->cflag = termios.c_cflag;
......
...@@ -56,11 +56,6 @@ static int exp_verify_string(char *cp, int max); ...@@ -56,11 +56,6 @@ static int exp_verify_string(char *cp, int max);
#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1) #define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
static struct cache_head *expkey_table[EXPKEY_HASHMAX]; static struct cache_head *expkey_table[EXPKEY_HASHMAX];
static inline int key_len(int type)
{
return type == 0 ? 8 : type == 1 ? 4 : 12;
}
static inline int svc_expkey_hash(struct svc_expkey *item) static inline int svc_expkey_hash(struct svc_expkey *item)
{ {
int hash = item->ek_fsidtype; int hash = item->ek_fsidtype;
...@@ -547,8 +542,8 @@ exp_get_key(svc_client *clp, dev_t dev, ino_t ino) ...@@ -547,8 +542,8 @@ exp_get_key(svc_client *clp, dev_t dev, ino_t ino)
mk_fsid_v0(fsidv, dev, ino); mk_fsid_v0(fsidv, dev, ino);
return exp_find_key(clp, 0, fsidv, NULL); return exp_find_key(clp, 0, fsidv, NULL);
} }
mk_fsid_v2(fsidv, dev, ino); mk_fsid_v3(fsidv, dev, ino);
return exp_find_key(clp, 2, fsidv, NULL); return exp_find_key(clp, 3, fsidv, NULL);
} }
/* /*
...@@ -684,8 +679,8 @@ static int exp_hash(struct auth_domain *clp, struct svc_export *exp) ...@@ -684,8 +679,8 @@ static int exp_hash(struct auth_domain *clp, struct svc_export *exp)
mk_fsid_v0(fsid, dev, inode->i_ino); mk_fsid_v0(fsid, dev, inode->i_ino);
return exp_set_key(clp, 0, fsid, exp); return exp_set_key(clp, 0, fsid, exp);
} }
mk_fsid_v2(fsid, dev, inode->i_ino); mk_fsid_v3(fsid, dev, inode->i_ino);
return exp_set_key(clp, 2, fsid, exp); return exp_set_key(clp, 3, fsid, exp);
} }
static void exp_unhash(struct svc_export *exp) static void exp_unhash(struct svc_export *exp)
......
...@@ -117,19 +117,14 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) ...@@ -117,19 +117,14 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
case 0: break; case 0: break;
default: goto out; default: goto out;
} }
len = key_len(fh->fh_fsid_type) / 4;
switch (fh->fh_fsid_type) { if (len == 0) goto out;
case 0: if (fh->fh_fsid_type == 2) {
len = 2; /* deprecated, convert to type 3 */
break;
case 1:
len = 1;
break;
case 2:
len = 3; len = 3;
break; fh->fh_fsid_type = 3;
default: fh->fh_fsid[0] = new_encode_dev(MKDEV(ntohl(fh->fh_fsid[0]), ntohl(fh->fh_fsid[1])));
goto out; fh->fh_fsid[1] = fh->fh_fsid[2];
} }
if ((data_left -= len)<0) goto out; if ((data_left -= len)<0) goto out;
exp = exp_find(rqstp->rq_client, fh->fh_fsid_type, datap, &rqstp->rq_chandle); exp = exp_find(rqstp->rq_client, fh->fh_fsid_type, datap, &rqstp->rq_chandle);
...@@ -336,19 +331,31 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st ...@@ -336,19 +331,31 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st
parent->d_name.name, dentry->d_name.name, parent->d_name.name, dentry->d_name.name,
(inode ? inode->i_ino : 0)); (inode ? inode->i_ino : 0));
/* for large devnums rules are simple */ if (ref_fh) {
if (!old_valid_dev(ex_dev)) {
ref_fh_version = 1;
if (exp->ex_flags & NFSEXP_FSID)
ref_fh_fsid_type = 1;
else
ref_fh_fsid_type = 2;
} else if (ref_fh) {
ref_fh_version = ref_fh->fh_handle.fh_version; ref_fh_version = ref_fh->fh_handle.fh_version;
ref_fh_fsid_type = ref_fh->fh_handle.fh_fsid_type; if (ref_fh_version == 0xca)
if (!(exp->ex_flags & NFSEXP_FSID) || ref_fh_fsid_type == 2)
ref_fh_fsid_type = 0; ref_fh_fsid_type = 0;
else
ref_fh_fsid_type = ref_fh->fh_handle.fh_fsid_type;
if (ref_fh_fsid_type > 3)
ref_fh_fsid_type = 0;
}
/* make sure ref_fh type works for given export */
if (ref_fh_fsid_type == 1 &&
!(exp->ex_flags & NFSEXP_FSID)) {
/* if we don't have an fsid, we cannot provide one... */
ref_fh_fsid_type = 0;
}
if (!old_valid_dev(ex_dev) && ref_fh_fsid_type == 0) {
/* for newer device numbers, we must use a newer fsid format */
ref_fh_version = 1;
ref_fh_fsid_type = 3;
} }
if (old_valid_dev(ex_dev) &&
(ref_fh_fsid_type == 2 || ref_fh_fsid_type == 3))
/* must use type1 for smaller device numbers */
ref_fh_fsid_type = 0;
if (ref_fh == fhp) if (ref_fh == fhp)
fh_put(ref_fh); fh_put(ref_fh);
...@@ -376,16 +383,22 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st ...@@ -376,16 +383,22 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st
if (inode) if (inode)
_fh_update_old(dentry, exp, &fhp->fh_handle); _fh_update_old(dentry, exp, &fhp->fh_handle);
} else { } else {
int len;
fhp->fh_handle.fh_version = 1; fhp->fh_handle.fh_version = 1;
fhp->fh_handle.fh_auth_type = 0; fhp->fh_handle.fh_auth_type = 0;
datap = fhp->fh_handle.fh_auth+0; datap = fhp->fh_handle.fh_auth+0;
fhp->fh_handle.fh_fsid_type = ref_fh_fsid_type; fhp->fh_handle.fh_fsid_type = ref_fh_fsid_type;
switch (ref_fh_fsid_type) { switch (ref_fh_fsid_type) {
case 0:
/*
* fsid_type 0:
* 2byte major, 2byte minor, 4byte inode
*/
mk_fsid_v0(datap, ex_dev,
exp->ex_dentry->d_inode->i_ino);
case 1: case 1:
/* fsid_type 1 == 4 bytes filesystem id */ /* fsid_type 1 == 4 bytes filesystem id */
mk_fsid_v1(datap, exp->ex_fsid); mk_fsid_v1(datap, exp->ex_fsid);
datap += 1;
fhp->fh_handle.fh_size = 2*4;
break; break;
case 2: case 2:
/* /*
...@@ -394,21 +407,22 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st ...@@ -394,21 +407,22 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st
*/ */
mk_fsid_v2(datap, ex_dev, mk_fsid_v2(datap, ex_dev,
exp->ex_dentry->d_inode->i_ino); exp->ex_dentry->d_inode->i_ino);
datap += 3;
fhp->fh_handle.fh_size = 4*4;
break; break;
default: case 3:
/* /*
* fsid_type 0: * fsid_type 3:
* 2byte major, 2byte minor, 4byte inode * 4byte devicenumber, 4byte inode
*/ */
mk_fsid_v0(datap, ex_dev, mk_fsid_v3(datap, ex_dev,
exp->ex_dentry->d_inode->i_ino); exp->ex_dentry->d_inode->i_ino);
datap += 2; break;
fhp->fh_handle.fh_size = 3*4;
} }
len = key_len(ref_fh_fsid_type);
datap += len/4;
fhp->fh_handle.fh_size = 4 + len;
if (inode) { if (inode) {
int size = fhp->fh_maxsize/4 - 3; int size = (fhp->fh_maxsize-len-4)/4;
fhp->fh_handle.fh_fileid_type = fhp->fh_handle.fh_fileid_type =
_fh_update(dentry, exp, datap, &size); _fh_update(dentry, exp, datap, &size);
fhp->fh_handle.fh_size += size*4; fhp->fh_handle.fh_size += size*4;
......
...@@ -66,8 +66,9 @@ struct nfs_fhbase_old { ...@@ -66,8 +66,9 @@ struct nfs_fhbase_old {
* 0 - 4 byte device id (ms-2-bytes major, ls-2-bytes minor), 4byte inode number * 0 - 4 byte device id (ms-2-bytes major, ls-2-bytes minor), 4byte inode number
* NOTE: we cannot use the kdev_t device id value, because kdev_t.h * NOTE: we cannot use the kdev_t device id value, because kdev_t.h
* says we mustn't. We must break it up and reassemble. * says we mustn't. We must break it up and reassemble.
* Possible future encodings:
* 1 - 4 byte user specified identifier * 1 - 4 byte user specified identifier
* 2 - 4 byte major, 4 byte minor, 4 byte inode number - DEPRECATED
* 3 - 4 byte device id, encoded for user-space, 4 byte inode number
* *
* The fileid_type identified how the file within the filesystem is encoded. * The fileid_type identified how the file within the filesystem is encoded.
* This is (will be) passed to, and set by, the underlying filesystem if it supports * This is (will be) passed to, and set by, the underlying filesystem if it supports
...@@ -114,6 +115,7 @@ struct knfsd_fh { ...@@ -114,6 +115,7 @@ struct knfsd_fh {
#define fh_auth_type fh_base.fh_new.fb_auth_type #define fh_auth_type fh_base.fh_new.fb_auth_type
#define fh_fileid_type fh_base.fh_new.fb_fileid_type #define fh_fileid_type fh_base.fh_new.fb_fileid_type
#define fh_auth fh_base.fh_new.fb_auth #define fh_auth fh_base.fh_new.fb_auth
#define fh_fsid fh_base.fh_new.fb_auth
#ifdef __KERNEL__ #ifdef __KERNEL__
...@@ -183,6 +185,23 @@ static inline void mk_fsid_v2(u32 *fsidv, dev_t dev, ino_t ino) ...@@ -183,6 +185,23 @@ static inline void mk_fsid_v2(u32 *fsidv, dev_t dev, ino_t ino)
fsidv[2] = ino_t_to_u32(ino); fsidv[2] = ino_t_to_u32(ino);
} }
static inline void mk_fsid_v3(u32 *fsidv, dev_t dev, ino_t ino)
{
fsidv[0] = new_encode_dev(dev);
fsidv[1] = ino_t_to_u32(ino);
}
static inline int key_len(int type)
{
switch(type) {
case 0: return 8;
case 1: return 4;
case 2: return 12;
case 3: return 8;
default: return 0;
}
}
/* /*
* Shorthand for dprintk()'s * Shorthand for dprintk()'s
*/ */
......
...@@ -1808,6 +1808,7 @@ ...@@ -1808,6 +1808,7 @@
#define PCI_VENDOR_ID_AFAVLAB 0x14db #define PCI_VENDOR_ID_AFAVLAB 0x14db
#define PCI_DEVICE_ID_AFAVLAB_P028 0x2180 #define PCI_DEVICE_ID_AFAVLAB_P028 0x2180
#define PCI_DEVICE_ID_AFAVLAB_P030 0x2182
#define PCI_VENDOR_ID_BROADCOM 0x14e4 #define PCI_VENDOR_ID_BROADCOM 0x14e4
#define PCI_DEVICE_ID_TIGON3_5700 0x1644 #define PCI_DEVICE_ID_TIGON3_5700 0x1644
......
...@@ -386,24 +386,24 @@ asmlinkage long sys_getdents64(unsigned int fd, ...@@ -386,24 +386,24 @@ asmlinkage long sys_getdents64(unsigned int fd,
unsigned int count); unsigned int count);
asmlinkage long sys_setsockopt(int fd, int level, int optname, asmlinkage long sys_setsockopt(int fd, int level, int optname,
char *optval, int optlen); char __user *optval, int optlen);
asmlinkage long sys_getsockopt(int fd, int level, int optname, asmlinkage long sys_getsockopt(int fd, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
asmlinkage long sys_bind(int, struct sockaddr *, int); asmlinkage long sys_bind(int, struct sockaddr __user *, int);
asmlinkage long sys_connect(int, struct sockaddr *, int); asmlinkage long sys_connect(int, struct sockaddr __user *, int);
asmlinkage long sys_accept(int, struct sockaddr *, int *); asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *);
asmlinkage long sys_getsockname(int, struct sockaddr *, int *); asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *);
asmlinkage long sys_getpeername(int, struct sockaddr *, int *); asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *);
asmlinkage long sys_send(int, void *, size_t, unsigned); asmlinkage long sys_send(int, void __user *, size_t, unsigned);
asmlinkage long sys_sendto(int, void *, size_t, unsigned, asmlinkage long sys_sendto(int, void __user *, size_t, unsigned,
struct sockaddr *, int); struct sockaddr __user *, int);
asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags); asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags);
asmlinkage long sys_recv(int, void *, size_t, unsigned); asmlinkage long sys_recv(int, void __user *, size_t, unsigned);
asmlinkage long sys_recvfrom(int, void *, size_t, unsigned, asmlinkage long sys_recvfrom(int, void __user *, size_t, unsigned,
struct sockaddr *, int *); struct sockaddr __user *, int __user *);
asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags);
asmlinkage long sys_socket(int, int, int); asmlinkage long sys_socket(int, int, int);
asmlinkage long sys_socketpair(int, int, int, int [2]); asmlinkage long sys_socketpair(int, int, int, int __user *);
asmlinkage long sys_socketcall(int call, unsigned long __user *args); asmlinkage long sys_socketcall(int call, unsigned long __user *args);
asmlinkage long sys_listen(int, int); asmlinkage long sys_listen(int, int);
asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
......
...@@ -321,6 +321,7 @@ enum ...@@ -321,6 +321,7 @@ enum
NET_TCP_LOW_LATENCY=93, NET_TCP_LOW_LATENCY=93,
NET_IPV4_IPFRAG_SECRET_INTERVAL=94, NET_IPV4_IPFRAG_SECRET_INTERVAL=94,
NET_TCP_WESTWOOD=95, NET_TCP_WESTWOOD=95,
NET_IPV4_IGMP_MAX_MSF=96,
}; };
enum { enum {
......
...@@ -35,21 +35,31 @@ ...@@ -35,21 +35,31 @@
#define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4) #define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4)
/* HCI dev events */ /* HCI dev events */
#define HCI_DEV_REG 1 #define HCI_DEV_REG 1
#define HCI_DEV_UNREG 2 #define HCI_DEV_UNREG 2
#define HCI_DEV_UP 3 #define HCI_DEV_UP 3
#define HCI_DEV_DOWN 4 #define HCI_DEV_DOWN 4
#define HCI_DEV_SUSPEND 5 #define HCI_DEV_SUSPEND 5
#define HCI_DEV_RESUME 6 #define HCI_DEV_RESUME 6
/* HCI notify events */
#define HCI_NOTIFY_CONN_ADD 1
#define HCI_NOTIFY_CONN_DEL 2
#define HCI_NOTIFY_VOICE_SETTING 3
/* HCI device types */ /* HCI device types */
#define HCI_VHCI 0 #define HCI_VHCI 0
#define HCI_USB 1 #define HCI_USB 1
#define HCI_PCCARD 2 #define HCI_PCCARD 2
#define HCI_UART 3 #define HCI_UART 3
#define HCI_RS232 4 #define HCI_RS232 4
#define HCI_PCI 5 #define HCI_PCI 5
/* HCI device quirks */
enum {
HCI_QUIRK_RESET_ON_INIT
};
/* HCI device flags */ /* HCI device flags */
enum { enum {
HCI_UP, HCI_UP,
...@@ -90,24 +100,24 @@ enum { ...@@ -90,24 +100,24 @@ enum {
#define HCIINQUIRY _IOR('H', 240, int) #define HCIINQUIRY _IOR('H', 240, int)
/* HCI timeouts */ /* HCI timeouts */
#define HCI_CONN_TIMEOUT (HZ * 40) #define HCI_CONN_TIMEOUT (HZ * 40)
#define HCI_DISCONN_TIMEOUT (HZ * 2) #define HCI_DISCONN_TIMEOUT (HZ * 2)
#define HCI_CONN_IDLE_TIMEOUT (HZ * 60) #define HCI_CONN_IDLE_TIMEOUT (HZ * 60)
/* HCI Packet types */ /* HCI Packet types */
#define HCI_COMMAND_PKT 0x01 #define HCI_COMMAND_PKT 0x01
#define HCI_ACLDATA_PKT 0x02 #define HCI_ACLDATA_PKT 0x02
#define HCI_SCODATA_PKT 0x03 #define HCI_SCODATA_PKT 0x03
#define HCI_EVENT_PKT 0x04 #define HCI_EVENT_PKT 0x04
#define HCI_UNKNOWN_PKT 0xff #define HCI_UNKNOWN_PKT 0xff
/* HCI Packet types */ /* HCI Packet types */
#define HCI_DM1 0x0008 #define HCI_DM1 0x0008
#define HCI_DM3 0x0400 #define HCI_DM3 0x0400
#define HCI_DM5 0x4000 #define HCI_DM5 0x4000
#define HCI_DH1 0x0010 #define HCI_DH1 0x0010
#define HCI_DH3 0x0800 #define HCI_DH3 0x0800
#define HCI_DH5 0x8000 #define HCI_DH5 0x8000
#define HCI_HV1 0x0020 #define HCI_HV1 0x0020
#define HCI_HV2 0x0040 #define HCI_HV2 0x0040
......
...@@ -77,6 +77,8 @@ struct hci_dev { ...@@ -77,6 +77,8 @@ struct hci_dev {
__u16 link_policy; __u16 link_policy;
__u16 link_mode; __u16 link_mode;
unsigned long quirks;
atomic_t cmd_cnt; atomic_t cmd_cnt;
unsigned int acl_cnt; unsigned int acl_cnt;
unsigned int sco_cnt; unsigned int sco_cnt;
...@@ -128,6 +130,7 @@ struct hci_dev { ...@@ -128,6 +130,7 @@ struct hci_dev {
int (*flush)(struct hci_dev *hdev); int (*flush)(struct hci_dev *hdev);
int (*send)(struct sk_buff *skb); int (*send)(struct sk_buff *skb);
void (*destruct)(struct hci_dev *hdev); void (*destruct)(struct hci_dev *hdev);
void (*notify)(struct hci_dev *hdev, unsigned int evt);
int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg); int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
}; };
......
...@@ -170,6 +170,9 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) ...@@ -170,6 +170,9 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
hci_conn_hash_add(hdev, conn); hci_conn_hash_add(hdev, conn);
tasklet_enable(&hdev->tx_task); tasklet_enable(&hdev->tx_task);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
return conn; return conn;
} }
...@@ -196,6 +199,9 @@ int hci_conn_del(struct hci_conn *conn) ...@@ -196,6 +199,9 @@ int hci_conn_del(struct hci_conn *conn)
hdev->acl_cnt += conn->sent; hdev->acl_cnt += conn->sent;
} }
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
tasklet_disable(&hdev->tx_task); tasklet_disable(&hdev->tx_task);
hci_conn_hash_del(hdev, conn); hci_conn_hash_del(hdev, conn);
tasklet_enable(&hdev->tx_task); tasklet_enable(&hdev->tx_task);
......
...@@ -189,6 +189,10 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) ...@@ -189,6 +189,10 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
/* Mandatory initialization */ /* Mandatory initialization */
/* Reset */
if (test_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks))
hci_send_cmd(hdev, OGF_HOST_CTL, OCF_RESET, 0, NULL);
/* Read Local Supported Features */ /* Read Local Supported Features */
hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES, 0, NULL); hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES, 0, NULL);
......
...@@ -232,6 +232,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb ...@@ -232,6 +232,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
hdev->voice_setting = setting; hdev->voice_setting = setting;
BT_DBG("%s: voice setting 0x%04x", hdev->name, setting); BT_DBG("%s: voice setting 0x%04x", hdev->name, setting);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
} }
break; break;
...@@ -247,6 +250,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb ...@@ -247,6 +250,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
hdev->voice_setting = setting; hdev->voice_setting = setting;
BT_DBG("%s: voice setting 0x%04x", hdev->name, setting); BT_DBG("%s: voice setting 0x%04x", hdev->name, setting);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
} }
hci_req_complete(hdev, status); hci_req_complete(hdev, status);
break; break;
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
#include <net/bluetooth/l2cap.h> #include <net/bluetooth/l2cap.h>
#include <net/bluetooth/rfcomm.h> #include <net/bluetooth/rfcomm.h>
#define VERSION "1.1" #define VERSION "1.2"
#ifndef CONFIG_BT_RFCOMM_DEBUG #ifndef CONFIG_BT_RFCOMM_DEBUG
#undef BT_DBG #undef BT_DBG
......
...@@ -50,6 +50,8 @@ ...@@ -50,6 +50,8 @@
#define RFCOMM_TTY_MAJOR 216 /* device node major id of the usb/bluetooth.c driver */ #define RFCOMM_TTY_MAJOR 216 /* device node major id of the usb/bluetooth.c driver */
#define RFCOMM_TTY_MINOR 0 #define RFCOMM_TTY_MINOR 0
static struct tty_driver *rfcomm_tty_driver;
struct rfcomm_dev { struct rfcomm_dev {
struct list_head list; struct list_head list;
atomic_t refcnt; atomic_t refcnt;
...@@ -98,6 +100,8 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev) ...@@ -98,6 +100,8 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev)
rfcomm_dlc_put(dlc); rfcomm_dlc_put(dlc);
tty_unregister_device(rfcomm_tty_driver, dev->id);
/* Refcount should only hit zero when called from rfcomm_dev_del() /* Refcount should only hit zero when called from rfcomm_dev_del()
which will have taken us off the list. Everything else are which will have taken us off the list. Everything else are
refcounting bugs. */ refcounting bugs. */
...@@ -239,8 +243,11 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) ...@@ -239,8 +243,11 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
if (err) { if (err) {
kfree(dev); kfree(dev);
return err; return err;
} else }
return dev->id;
tty_register_device(rfcomm_tty_driver, dev->id, NULL);
return dev->id;
} }
static void rfcomm_dev_del(struct rfcomm_dev *dev) static void rfcomm_dev_del(struct rfcomm_dev *dev)
...@@ -871,8 +878,6 @@ static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsign ...@@ -871,8 +878,6 @@ static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsign
/* ---- TTY structure ---- */ /* ---- TTY structure ---- */
static struct tty_driver *rfcomm_tty_driver;
static struct tty_operations rfcomm_ops = { static struct tty_operations rfcomm_ops = {
.open = rfcomm_tty_open, .open = rfcomm_tty_open,
.close = rfcomm_tty_close, .close = rfcomm_tty_close,
...@@ -906,7 +911,7 @@ int rfcomm_init_ttys(void) ...@@ -906,7 +911,7 @@ int rfcomm_init_ttys(void)
rfcomm_tty_driver->minor_start = RFCOMM_TTY_MINOR; rfcomm_tty_driver->minor_start = RFCOMM_TTY_MINOR;
rfcomm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; rfcomm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL; rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL;
rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW; rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;
rfcomm_tty_driver->init_termios = tty_std_termios; rfcomm_tty_driver->init_termios = tty_std_termios;
rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
tty_set_operations(rfcomm_tty_driver, &rfcomm_ops); tty_set_operations(rfcomm_tty_driver, &rfcomm_ops);
......
...@@ -105,7 +105,8 @@ ...@@ -105,7 +105,8 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#endif #endif
#define IP_MAX_MEMBERSHIPS 20 #define IP_MAX_MEMBERSHIPS 20
#define IP_MAX_MSF 10
#ifdef CONFIG_IP_MULTICAST #ifdef CONFIG_IP_MULTICAST
/* Parameter names and values are taken from igmp-v2-06 draft */ /* Parameter names and values are taken from igmp-v2-06 draft */
...@@ -1325,6 +1326,7 @@ static struct in_device * ip_mc_find_dev(struct ip_mreqn *imr) ...@@ -1325,6 +1326,7 @@ static struct in_device * ip_mc_find_dev(struct ip_mreqn *imr)
* Join a socket to a group * Join a socket to a group
*/ */
int sysctl_igmp_max_memberships = IP_MAX_MEMBERSHIPS; int sysctl_igmp_max_memberships = IP_MAX_MEMBERSHIPS;
int sysctl_igmp_max_msf = IP_MAX_MSF;
static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode, static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,
...@@ -1790,6 +1792,10 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct ...@@ -1790,6 +1792,10 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
} }
/* else, add a new source to the filter */ /* else, add a new source to the filter */
if (psl && psl->sl_count >= sysctl_igmp_max_msf) {
err = -ENOBUFS;
goto done;
}
if (!psl || psl->sl_count == psl->sl_max) { if (!psl || psl->sl_count == psl->sl_max) {
struct ip_sf_socklist *newpsl; struct ip_sf_socklist *newpsl;
int count = IP_SFBLOCK; int count = IP_SFBLOCK;
......
...@@ -618,6 +618,7 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt ...@@ -618,6 +618,7 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
case IP_MSFILTER: case IP_MSFILTER:
{ {
extern int sysctl_optmem_max; extern int sysctl_optmem_max;
extern int sysctl_igmp_max_msf;
struct ip_msfilter *msf; struct ip_msfilter *msf;
if (optlen < IP_MSFILTER_SIZE(0)) if (optlen < IP_MSFILTER_SIZE(0))
...@@ -636,9 +637,14 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt ...@@ -636,9 +637,14 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
kfree(msf); kfree(msf);
break; break;
} }
if (IP_MSFILTER_SIZE(msf->imsf_numsrc) < /* numsrc >= (1G-4) overflow in 32 bits */
IP_MSFILTER_SIZE(0) || if (msf->imsf_numsrc >= 0x3ffffffcU ||
IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) { msf->imsf_numsrc > sysctl_igmp_max_msf) {
kfree(msf);
err = -ENOBUFS;
break;
}
if (IP_MSFILTER_SIZE(msf->imsf_numsrc) > optlen) {
kfree(msf); kfree(msf);
err = -EINVAL; err = -EINVAL;
break; break;
......
...@@ -39,6 +39,7 @@ extern int sysctl_icmp_ratemask; ...@@ -39,6 +39,7 @@ extern int sysctl_icmp_ratemask;
/* From igmp.c */ /* From igmp.c */
extern int sysctl_igmp_max_memberships; extern int sysctl_igmp_max_memberships;
extern int sysctl_igmp_max_msf;
/* From inetpeer.c */ /* From inetpeer.c */
extern int inet_peer_threshold; extern int inet_peer_threshold;
...@@ -411,6 +412,14 @@ ctl_table ipv4_table[] = { ...@@ -411,6 +412,14 @@ ctl_table ipv4_table[] = {
}, },
#endif #endif
{
.ctl_name = NET_IPV4_IGMP_MAX_MSF,
.procname = "igmp_max_msf",
.data = &sysctl_igmp_max_msf,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_dointvec
},
{ {
.ctl_name = NET_IPV4_INET_PEER_THRESHOLD, .ctl_name = NET_IPV4_INET_PEER_THRESHOLD,
.procname = "inet_peer_threshold", .procname = "inet_peer_threshold",
......
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