Commit 5326862d authored by Linus Torvalds's avatar Linus Torvalds

Automerge

parents a2f1b7bc cfc632c8
...@@ -28,7 +28,7 @@ struct aligninfo { ...@@ -28,7 +28,7 @@ struct aligninfo {
#define OPCD(inst) (((inst) & 0xFC000000) >> 26) #define OPCD(inst) (((inst) & 0xFC000000) >> 26)
#define RS(inst) (((inst) & 0x03E00000) >> 21) #define RS(inst) (((inst) & 0x03E00000) >> 21)
#define RA(inst) (((inst) & 0x001F0000) >> 16) #define RA(inst) (((inst) & 0x001F0000) >> 16)
#define IS_DFORM(code) ((code) >= 32 && (code) <= 47) #define IS_DFORM(code) ((code) >= 32 && (code) <= 55)
#endif #endif
#define INVALID { 0, 0 } #define INVALID { 0, 0 }
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
#define FB_MAX 8 #define FB_MAX 8
#endif #endif
#define ALIGN(x) (((x) + sizeof(unsigned long)-1) & -sizeof(unsigned long)) #define ALIGNUL(x) (((x) + sizeof(unsigned long)-1) & -sizeof(unsigned long))
struct prom_args { struct prom_args {
const char *service; const char *service;
...@@ -376,7 +376,7 @@ check_display(unsigned long mem) ...@@ -376,7 +376,7 @@ check_display(unsigned long mem)
} }
} }
return ALIGN(mem); return ALIGNUL(mem);
} }
/* This function will enable the early boot text when doing OF booting. This /* This function will enable the early boot text when doing OF booting. This
...@@ -457,7 +457,7 @@ copy_device_tree(unsigned long mem_start, unsigned long mem_end) ...@@ -457,7 +457,7 @@ copy_device_tree(unsigned long mem_start, unsigned long mem_end)
prom_exit(); prom_exit();
} }
allnextp = &allnodes; allnextp = &allnodes;
mem_start = ALIGN(mem_start); mem_start = ALIGNUL(mem_start);
new_start = inspect_node(root, 0, mem_start, mem_end, &allnextp); new_start = inspect_node(root, 0, mem_start, mem_end, &allnextp);
*allnextp = 0; *allnextp = 0;
return new_start; return new_start;
...@@ -501,7 +501,7 @@ inspect_node(phandle node, struct device_node *dad, ...@@ -501,7 +501,7 @@ inspect_node(phandle node, struct device_node *dad,
if ((int) call_prom("nextprop", 3, 1, node, prev_name, if ((int) call_prom("nextprop", 3, 1, node, prev_name,
namep) <= 0) namep) <= 0)
break; break;
mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1); mem_start = ALIGNUL((unsigned long)namep + strlen(namep) + 1);
prev_name = namep; prev_name = namep;
valp = (unsigned char *) mem_start; valp = (unsigned char *) mem_start;
pp->value = PTRUNRELOC(valp); pp->value = PTRUNRELOC(valp);
...@@ -514,7 +514,7 @@ inspect_node(phandle node, struct device_node *dad, ...@@ -514,7 +514,7 @@ inspect_node(phandle node, struct device_node *dad,
if (pp->length > MAX_PROPERTY_LENGTH) if (pp->length > MAX_PROPERTY_LENGTH)
continue; /* ignore this property */ continue; /* ignore this property */
#endif #endif
mem_start = ALIGN(mem_start + pp->length); mem_start = ALIGNUL(mem_start + pp->length);
*prev_propp = PTRUNRELOC(pp); *prev_propp = PTRUNRELOC(pp);
prev_propp = &pp->next; prev_propp = &pp->next;
} }
...@@ -526,7 +526,7 @@ inspect_node(phandle node, struct device_node *dad, ...@@ -526,7 +526,7 @@ inspect_node(phandle node, struct device_node *dad,
namep = (char *) (pp + 1); namep = (char *) (pp + 1);
pp->name = PTRUNRELOC(namep); pp->name = PTRUNRELOC(namep);
strcpy(namep, "linux,phandle"); strcpy(namep, "linux,phandle");
mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1); mem_start = ALIGNUL((unsigned long)namep + strlen(namep) + 1);
pp->value = (unsigned char *) PTRUNRELOC(&np->node); pp->value = (unsigned char *) PTRUNRELOC(&np->node);
pp->length = sizeof(np->node); pp->length = sizeof(np->node);
} }
...@@ -538,7 +538,7 @@ inspect_node(phandle node, struct device_node *dad, ...@@ -538,7 +538,7 @@ inspect_node(phandle node, struct device_node *dad,
if (l >= 0) { if (l >= 0) {
np->full_name = PTRUNRELOC((char *) mem_start); np->full_name = PTRUNRELOC((char *) mem_start);
*(char *)(mem_start + l) = 0; *(char *)(mem_start + l) = 0;
mem_start = ALIGN(mem_start + l + 1); mem_start = ALIGNUL(mem_start + l + 1);
} }
/* do all our children */ /* do all our children */
...@@ -741,7 +741,7 @@ prom_init(int r3, int r4, prom_entry pp) ...@@ -741,7 +741,7 @@ prom_init(int r3, int r4, prom_entry pp)
*d = 0; *d = 0;
call_prom("canon", 3, 1, p, d, 1<<20); call_prom("canon", 3, 1, p, d, 1<<20);
bootdevice = PTRUNRELOC(d); bootdevice = PTRUNRELOC(d);
mem = ALIGN(mem + strlen(d) + 1); mem = ALIGNUL(mem + strlen(d) + 1);
} }
prom_instantiate_rtas(); prom_instantiate_rtas();
......
...@@ -400,13 +400,17 @@ heathrow_modem_enable(struct device_node* node, int param, int value) ...@@ -400,13 +400,17 @@ heathrow_modem_enable(struct device_node* node, int param, int value)
LOCK(flags); LOCK(flags);
MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1); MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1);
(void)MACIO_IN8(HRW_GPIO_MODEM_RESET); (void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
UNLOCK(flags); mdelay(250); LOCK(flags); UNLOCK(flags);
mdelay(250);
LOCK(flags);
MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio); MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio);
(void)MACIO_IN8(HRW_GPIO_MODEM_RESET); (void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
UNLOCK(flags); mdelay(250); LOCK(flags); UNLOCK(flags);
mdelay(250);
LOCK(flags);
MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1); MACIO_OUT8(HRW_GPIO_MODEM_RESET, gpio | 1);
(void)MACIO_IN8(HRW_GPIO_MODEM_RESET); (void)MACIO_IN8(HRW_GPIO_MODEM_RESET);
UNLOCK(flags); mdelay(250); LOCK(flags); UNLOCK(flags);
} }
return 0; return 0;
} }
......
...@@ -1710,7 +1710,6 @@ struct pci_pool { /* the pool */ ...@@ -1710,7 +1710,6 @@ struct pci_pool { /* the pool */
spinlock_t lock; spinlock_t lock;
size_t blocks_per_page; size_t blocks_per_page;
size_t size; size_t size;
int flags;
struct pci_dev *dev; struct pci_dev *dev;
size_t allocation; size_t allocation;
char name [32]; char name [32];
...@@ -1727,8 +1726,6 @@ struct pci_page { /* cacheable header for 'allocation' bytes */ ...@@ -1727,8 +1726,6 @@ struct pci_page { /* cacheable header for 'allocation' bytes */
#define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000) #define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000)
#define POOL_POISON_BYTE 0xa7 #define POOL_POISON_BYTE 0xa7
// #define CONFIG_PCIPOOL_DEBUG
/** /**
* pci_pool_create - Creates a pool of pci consistent memory blocks, for dma. * pci_pool_create - Creates a pool of pci consistent memory blocks, for dma.
...@@ -1737,7 +1734,7 @@ struct pci_page { /* cacheable header for 'allocation' bytes */ ...@@ -1737,7 +1734,7 @@ struct pci_page { /* cacheable header for 'allocation' bytes */
* @size: size of the blocks in this pool. * @size: size of the blocks in this pool.
* @align: alignment requirement for blocks; must be a power of two * @align: alignment requirement for blocks; must be a power of two
* @allocation: returned blocks won't cross this boundary (or zero) * @allocation: returned blocks won't cross this boundary (or zero)
* @flags: SLAB_* flags (not all are supported). * @mem_flags: SLAB_* flags.
* *
* Returns a pci allocation pool with the requested characteristics, or * Returns a pci allocation pool with the requested characteristics, or
* null if one can't be created. Given one of these pools, pci_pool_alloc() * null if one can't be created. Given one of these pools, pci_pool_alloc()
...@@ -1753,7 +1750,7 @@ struct pci_page { /* cacheable header for 'allocation' bytes */ ...@@ -1753,7 +1750,7 @@ struct pci_page { /* cacheable header for 'allocation' bytes */
*/ */
struct pci_pool * struct pci_pool *
pci_pool_create (const char *name, struct pci_dev *pdev, pci_pool_create (const char *name, struct pci_dev *pdev,
size_t size, size_t align, size_t allocation, int flags) size_t size, size_t align, size_t allocation, int mem_flags)
{ {
struct pci_pool *retval; struct pci_pool *retval;
...@@ -1777,13 +1774,9 @@ pci_pool_create (const char *name, struct pci_dev *pdev, ...@@ -1777,13 +1774,9 @@ pci_pool_create (const char *name, struct pci_dev *pdev,
} else if (allocation < size) } else if (allocation < size)
return 0; return 0;
if (!(retval = kmalloc (sizeof *retval, flags))) if (!(retval = kmalloc (sizeof *retval, mem_flags)))
return retval; return retval;
#ifdef CONFIG_PCIPOOL_DEBUG
flags |= SLAB_POISON;
#endif
strncpy (retval->name, name, sizeof retval->name); strncpy (retval->name, name, sizeof retval->name);
retval->name [sizeof retval->name - 1] = 0; retval->name [sizeof retval->name - 1] = 0;
...@@ -1791,17 +1784,10 @@ pci_pool_create (const char *name, struct pci_dev *pdev, ...@@ -1791,17 +1784,10 @@ pci_pool_create (const char *name, struct pci_dev *pdev,
INIT_LIST_HEAD (&retval->page_list); INIT_LIST_HEAD (&retval->page_list);
spin_lock_init (&retval->lock); spin_lock_init (&retval->lock);
retval->size = size; retval->size = size;
retval->flags = flags;
retval->allocation = allocation; retval->allocation = allocation;
retval->blocks_per_page = allocation / size; retval->blocks_per_page = allocation / size;
init_waitqueue_head (&retval->waitq); init_waitqueue_head (&retval->waitq);
#ifdef CONFIG_PCIPOOL_DEBUG
printk (KERN_DEBUG "pcipool create %s/%s size %d, %d/page (%d alloc)\n",
pdev ? pdev->slot_name : NULL, retval->name, size,
retval->blocks_per_page, allocation);
#endif
return retval; return retval;
} }
...@@ -1824,8 +1810,9 @@ pool_alloc_page (struct pci_pool *pool, int mem_flags) ...@@ -1824,8 +1810,9 @@ pool_alloc_page (struct pci_pool *pool, int mem_flags)
&page->dma); &page->dma);
if (page->vaddr) { if (page->vaddr) {
memset (page->bitmap, 0xff, mapsize); // bit set == free memset (page->bitmap, 0xff, mapsize); // bit set == free
if (pool->flags & SLAB_POISON) #ifdef CONFIG_DEBUG_SLAB
memset (page->vaddr, POOL_POISON_BYTE, pool->allocation); memset (page->vaddr, POOL_POISON_BYTE, pool->allocation);
#endif
list_add (&page->page_list, &pool->page_list); list_add (&page->page_list, &pool->page_list);
} else { } else {
kfree (page); kfree (page);
...@@ -1851,8 +1838,9 @@ pool_free_page (struct pci_pool *pool, struct pci_page *page) ...@@ -1851,8 +1838,9 @@ pool_free_page (struct pci_pool *pool, struct pci_page *page)
{ {
dma_addr_t dma = page->dma; dma_addr_t dma = page->dma;
if (pool->flags & SLAB_POISON) #ifdef CONFIG_DEBUG_SLAB
memset (page->vaddr, POOL_POISON_BYTE, pool->allocation); memset (page->vaddr, POOL_POISON_BYTE, pool->allocation);
#endif
pci_free_consistent (pool->dev, pool->allocation, page->vaddr, dma); pci_free_consistent (pool->dev, pool->allocation, page->vaddr, dma);
list_del (&page->page_list); list_del (&page->page_list);
kfree (page); kfree (page);
...@@ -1871,12 +1859,6 @@ pci_pool_destroy (struct pci_pool *pool) ...@@ -1871,12 +1859,6 @@ pci_pool_destroy (struct pci_pool *pool)
{ {
unsigned long flags; unsigned long flags;
#ifdef CONFIG_PCIPOOL_DEBUG
printk (KERN_DEBUG "pcipool destroy %s/%s\n",
pool->dev ? pool->dev->slot_name : NULL,
pool->name);
#endif
spin_lock_irqsave (&pool->lock, flags); spin_lock_irqsave (&pool->lock, flags);
while (!list_empty (&pool->page_list)) { while (!list_empty (&pool->page_list)) {
struct pci_page *page; struct pci_page *page;
...@@ -2010,30 +1992,27 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma) ...@@ -2010,30 +1992,27 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
pool->name, vaddr, (unsigned long) dma); pool->name, vaddr, (unsigned long) dma);
return; return;
} }
#ifdef CONFIG_PCIPOOL_DEBUG
if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%lx\n",
pool->dev ? pool->dev->slot_name : NULL,
pool->name, vaddr, (unsigned long) dma);
return;
}
#endif
block = dma - page->dma; block = dma - page->dma;
block /= pool->size; block /= pool->size;
map = block / BITS_PER_LONG; map = block / BITS_PER_LONG;
block %= BITS_PER_LONG; block %= BITS_PER_LONG;
#ifdef CONFIG_PCIPOOL_DEBUG #ifdef CONFIG_DEBUG_SLAB
if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%lx\n",
pool->dev ? pool->dev->slot_name : NULL,
pool->name, vaddr, (unsigned long) dma);
return;
}
if (page->bitmap [map] & (1UL << block)) { if (page->bitmap [map] & (1UL << block)) {
printk (KERN_ERR "pci_pool_free %s/%s, dma %x already free\n", printk (KERN_ERR "pci_pool_free %s/%s, dma %x already free\n",
pool->dev ? pool->dev->slot_name : NULL, pool->dev ? pool->dev->slot_name : NULL,
pool->name, dma); pool->name, dma);
return; return;
} }
memset (vaddr, POOL_POISON_BYTE, pool->size);
#endif #endif
if (pool->flags & SLAB_POISON)
memset (vaddr, POOL_POISON_BYTE, pool->size);
spin_lock_irqsave (&pool->lock, flags); spin_lock_irqsave (&pool->lock, flags);
set_bit (block, &page->bitmap [map]); set_bit (block, &page->bitmap [map]);
......
...@@ -382,6 +382,7 @@ CONFIG_USB_KAWETH ...@@ -382,6 +382,7 @@ CONFIG_USB_KAWETH
CONFIG_USB_CATC CONFIG_USB_CATC
Say Y if you want to use one of the following 10Mbps USB Ethernet Say Y if you want to use one of the following 10Mbps USB Ethernet
device based on the EL1210A chip. Supported devices are: device based on the EL1210A chip. Supported devices are:
Belkin F5U011
Belkin F5U111 Belkin F5U111
CATC NetMate CATC NetMate
CATC NetMate II CATC NetMate II
......
This diff is collapsed.
...@@ -110,10 +110,11 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned ...@@ -110,10 +110,11 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned
memset(field, 0, sizeof(struct hid_field) + usages * sizeof(struct hid_usage) memset(field, 0, sizeof(struct hid_field) + usages * sizeof(struct hid_usage)
+ values * sizeof(unsigned)); + values * sizeof(unsigned));
report->field[report->maxfield++] = field; report->field[report->maxfield] = field;
field->usage = (struct hid_usage *)(field + 1); field->usage = (struct hid_usage *)(field + 1);
field->value = (unsigned *)(field->usage + usages); field->value = (unsigned *)(field->usage + usages);
field->report = report; field->report = report;
field->index = report->maxfield++;
return field; return field;
} }
...@@ -741,8 +742,20 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, s ...@@ -741,8 +742,20 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, s
if (hid->claimed & HID_CLAIMED_INPUT) if (hid->claimed & HID_CLAIMED_INPUT)
hidinput_hid_event(hid, field, usage, value); hidinput_hid_event(hid, field, usage, value);
#ifdef CONFIG_USB_HIDDEV #ifdef CONFIG_USB_HIDDEV
if (hid->claimed & HID_CLAIMED_HIDDEV) if (hid->claimed & HID_CLAIMED_HIDDEV) {
hiddev_hid_event(hid, usage->hid, value); struct hiddev_usage_ref uref;
unsigned type = field->report_type;
uref.report_type =
(type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT :
((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT :
((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0));
uref.report_id = field->report->id;
uref.field_index = field->index;
uref.usage_index = (usage - field->usage);
uref.usage_code = usage->hid;
uref.value = value;
hiddev_hid_event(hid, &uref);
}
#endif #endif
} }
...@@ -839,6 +852,21 @@ static int hid_input_report(int type, struct urb *urb) ...@@ -839,6 +852,21 @@ static int hid_input_report(int type, struct urb *urb)
return -1; return -1;
} }
#ifdef CONFIG_USB_HIDDEV
/* Notify listeners that a report has been received */
if (hid->claimed & HID_CLAIMED_HIDDEV) {
struct hiddev_usage_ref uref;
memset(&uref, 0, sizeof(uref));
uref.report_type =
(type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT :
((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT :
((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0));
uref.report_id = report->id;
uref.field_index = HID_FIELD_INDEX_NONE;
hiddev_hid_event(hid, &uref);
}
#endif
size = ((report->size - 1) >> 3) + 1; size = ((report->size - 1) >> 3) + 1;
if (len < size) { if (len < size) {
...@@ -1096,6 +1124,9 @@ void hid_submit_report(struct hid_device *hid, struct hid_report *report, unsign ...@@ -1096,6 +1124,9 @@ void hid_submit_report(struct hid_device *hid, struct hid_report *report, unsign
int head; int head;
unsigned long flags; unsigned long flags;
if ((hid->quirks & HID_QUIRK_NOGET) && dir == USB_DIR_IN)
return;
if (hid->urbout && dir == USB_DIR_OUT && report->type == HID_OUTPUT_REPORT) { if (hid->urbout && dir == USB_DIR_OUT && report->type == HID_OUTPUT_REPORT) {
spin_lock_irqsave(&hid->outlock, flags); spin_lock_irqsave(&hid->outlock, flags);
...@@ -1238,18 +1269,27 @@ void hid_init_reports(struct hid_device *hid) ...@@ -1238,18 +1269,27 @@ void hid_init_reports(struct hid_device *hid)
#define USB_DEVICE_ID_POWERMATE 0x0410 #define USB_DEVICE_ID_POWERMATE 0x0410
#define USB_DEVICE_ID_SOUNDKNOB 0x04AA #define USB_DEVICE_ID_SOUNDKNOB 0x04AA
#define USB_VENDOR_ID_ATEN 0x0557
#define USB_DEVICE_ID_ATEN_UC100KM 0x2004
#define USB_DEVICE_ID_ATEN_CS124U 0x2202
#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
struct hid_blacklist { struct hid_blacklist {
__u16 idVendor; __u16 idVendor;
__u16 idProduct; __u16 idProduct;
unsigned quirks;
} hid_blacklist[] = { } hid_blacklist[] = {
{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE }, { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS }, { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 1}, { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 1, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 2}, { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 2, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 3}, { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 3, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 4}, { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 4, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE }, { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB }, { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE },
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
{ 0, 0 } { 0, 0 }
}; };
...@@ -1258,13 +1298,17 @@ static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum) ...@@ -1258,13 +1298,17 @@ static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum)
struct usb_interface_descriptor *interface = dev->actconfig->interface[ifnum].altsetting + 0; struct usb_interface_descriptor *interface = dev->actconfig->interface[ifnum].altsetting + 0;
struct hid_descriptor *hdesc; struct hid_descriptor *hdesc;
struct hid_device *hid; struct hid_device *hid;
unsigned rsize = 0; unsigned quirks = 0, rsize = 0;
char *buf; char *buf;
int n; int n;
for (n = 0; hid_blacklist[n].idVendor; n++) for (n = 0; hid_blacklist[n].idVendor; n++)
if ((hid_blacklist[n].idVendor == dev->descriptor.idVendor) && if ((hid_blacklist[n].idVendor == dev->descriptor.idVendor) &&
(hid_blacklist[n].idProduct == dev->descriptor.idProduct)) return NULL; (hid_blacklist[n].idProduct == dev->descriptor.idProduct))
quirks = hid_blacklist[n].quirks;
if (quirks & HID_QUIRK_IGNORE)
return NULL;
if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->bNumEndpoints) || if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->bNumEndpoints) ||
usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) { usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
...@@ -1302,6 +1346,8 @@ static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum) ...@@ -1302,6 +1346,8 @@ static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum)
} }
} }
hid->quirks = quirks;
for (n = 0; n < interface->bNumEndpoints; n++) { for (n = 0; n < interface->bNumEndpoints; n++) {
struct usb_endpoint_descriptor *endpoint = &interface->endpoint[n]; struct usb_endpoint_descriptor *endpoint = &interface->endpoint[n];
......
...@@ -203,6 +203,8 @@ struct hid_item { ...@@ -203,6 +203,8 @@ struct hid_item {
#define HID_QUIRK_INVERT 0x01 #define HID_QUIRK_INVERT 0x01
#define HID_QUIRK_NOTOUCH 0x02 #define HID_QUIRK_NOTOUCH 0x02
#define HID_QUIRK_IGNORE 0x04
#define HID_QUIRK_NOGET 0x08
/* /*
* This is the global enviroment of the parser. This information is * This is the global enviroment of the parser. This information is
...@@ -276,6 +278,7 @@ struct hid_field { ...@@ -276,6 +278,7 @@ struct hid_field {
__s32 unit_exponent; __s32 unit_exponent;
unsigned unit; unsigned unit;
struct hid_report *report; /* associated report */ struct hid_report *report; /* associated report */
unsigned index; /* index into report->field[] */
}; };
#define HID_MAX_FIELDS 64 #define HID_MAX_FIELDS 64
......
...@@ -50,9 +50,10 @@ struct hiddev { ...@@ -50,9 +50,10 @@ struct hiddev {
}; };
struct hiddev_list { struct hiddev_list {
struct hiddev_event buffer[HIDDEV_BUFFER_SIZE]; struct hiddev_usage_ref buffer[HIDDEV_BUFFER_SIZE];
int head; int head;
int tail; int tail;
unsigned flags;
struct fasync_struct *fasync; struct fasync_struct *fasync;
struct hiddev *hiddev; struct hiddev *hiddev;
struct hiddev_list *next; struct hiddev_list *next;
...@@ -146,17 +147,19 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref) ...@@ -146,17 +147,19 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref)
* This is where hid.c calls into hiddev to pass an event that occurred over * This is where hid.c calls into hiddev to pass an event that occurred over
* the interrupt pipe * the interrupt pipe
*/ */
void hiddev_hid_event(struct hid_device *hid, unsigned int usage, int value) void hiddev_hid_event(struct hid_device *hid, struct hiddev_usage_ref *uref)
{ {
struct hiddev *hiddev = hid->hiddev; struct hiddev *hiddev = hid->hiddev;
struct hiddev_list *list = hiddev->list; struct hiddev_list *list = hiddev->list;
while (list) { while (list) {
list->buffer[list->head].hid = usage; if (uref->field_index != HID_FIELD_INDEX_NONE ||
list->buffer[list->head].value = value; (list->flags & HIDDEV_FLAG_REPORT) != 0) {
list->head = (list->head + 1) & (HIDDEV_BUFFER_SIZE - 1); list->buffer[list->head] = *uref;
list->head = (list->head + 1) &
kill_fasync(&list->fasync, SIGIO, POLL_IN); (HIDDEV_BUFFER_SIZE - 1);
kill_fasync(&list->fasync, SIGIO, POLL_IN);
}
list = list->next; list = list->next;
} }
...@@ -257,43 +260,67 @@ static ssize_t hiddev_read(struct file * file, char * buffer, size_t count, ...@@ -257,43 +260,67 @@ static ssize_t hiddev_read(struct file * file, char * buffer, size_t count,
{ {
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
struct hiddev_list *list = file->private_data; struct hiddev_list *list = file->private_data;
int event_size;
int retval = 0; int retval = 0;
if (list->head == list->tail) { event_size = ((list->flags & HIDDEV_FLAG_UREF) != 0) ?
sizeof(struct hiddev_usage_ref) : sizeof(struct hiddev_event);
add_wait_queue(&list->hiddev->wait, &wait);
set_current_state(TASK_INTERRUPTIBLE);
while (list->head == list->tail) { if (count < event_size) return 0;
if (file->f_flags & O_NONBLOCK) { while (retval == 0) {
retval = -EAGAIN; if (list->head == list->tail) {
break; add_wait_queue(&list->hiddev->wait, &wait);
} set_current_state(TASK_INTERRUPTIBLE);
if (signal_pending(current)) {
retval = -ERESTARTSYS; while (list->head == list->tail) {
break; if (file->f_flags & O_NONBLOCK) {
} retval = -EAGAIN;
if (!list->hiddev->exist) { break;
retval = -EIO; }
break; if (signal_pending(current)) {
retval = -ERESTARTSYS;
break;
}
if (!list->hiddev->exist) {
retval = -EIO;
break;
}
schedule();
} }
schedule(); set_current_state(TASK_RUNNING);
remove_wait_queue(&list->hiddev->wait, &wait);
} }
set_current_state(TASK_RUNNING); if (retval)
remove_wait_queue(&list->hiddev->wait, &wait); return retval;
}
if (retval) while (list->head != list->tail &&
return retval; retval + event_size <= count) {
if ((list->flags & HIDDEV_FLAG_UREF) == 0) {
if (list->buffer[list->tail].field_index !=
HID_FIELD_INDEX_NONE) {
struct hiddev_event event;
event.hid = list->buffer[list->tail].usage_code;
event.value = list->buffer[list->tail].value;
if (copy_to_user(buffer + retval, &event, sizeof(struct hiddev_event)))
return -EFAULT;
retval += sizeof(struct hiddev_event);
}
} else {
if (list->buffer[list->tail].field_index != HID_FIELD_INDEX_NONE ||
(list->flags & HIDDEV_FLAG_REPORT) != 0) {
if (copy_to_user(buffer + retval, list->buffer + list->tail, sizeof(struct hiddev_usage_ref)))
return -EFAULT;
retval += sizeof(struct hiddev_usage_ref);
}
}
list->tail = (list->tail + 1) & (HIDDEV_BUFFER_SIZE - 1);
}
while (list->head != list->tail && retval + sizeof(struct hiddev_event) <= count) {
if (copy_to_user(buffer + retval, list->buffer + list->tail,
sizeof(struct hiddev_event))) return -EFAULT;
list->tail = (list->tail + 1) & (HIDDEV_BUFFER_SIZE - 1);
retval += sizeof(struct hiddev_event);
} }
return retval; return retval;
...@@ -358,6 +385,25 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, ...@@ -358,6 +385,25 @@ static int hiddev_ioctl(struct inode *inode, struct file *file,
return copy_to_user((void *) arg, &dinfo, sizeof(dinfo)); return copy_to_user((void *) arg, &dinfo, sizeof(dinfo));
} }
case HIDIOCGFLAG:
return put_user(list->flags, (int *) arg);
case HIDIOCSFLAG:
{
int newflags;
if (get_user(newflags, (int *) arg))
return -EFAULT;
if ((newflags & ~HIDDEV_FLAGS) != 0 ||
((newflags & HIDDEV_FLAG_REPORT) != 0 &&
(newflags & HIDDEV_FLAG_UREF) == 0))
return -EINVAL;
list->flags = newflags;
return 0;
}
case HIDIOCGSTRING: case HIDIOCGSTRING:
{ {
int idx, len; int idx, len;
......
This diff is collapsed.
...@@ -262,7 +262,7 @@ static int cyberjack_write (struct usb_serial_port *port, int from_user, const u ...@@ -262,7 +262,7 @@ static int cyberjack_write (struct usb_serial_port *port, int from_user, const u
port); port);
/* send the data out the bulk port */ /* send the data out the bulk port */
result = usb_submit_urb(port->write_urb, GFP_KERNEL); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) { if (result) {
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
/* Throw away data. No better idea what to do with it. */ /* Throw away data. No better idea what to do with it. */
...@@ -331,7 +331,7 @@ static void cyberjack_read_int_callback( struct urb *urb ) ...@@ -331,7 +331,7 @@ static void cyberjack_read_int_callback( struct urb *urb )
if( !old_rdtodo ) { if( !old_rdtodo ) {
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if( result ) if( result )
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
dbg(__FUNCTION__ " - usb_submit_urb(read urb)"); dbg(__FUNCTION__ " - usb_submit_urb(read urb)");
...@@ -387,7 +387,7 @@ static void cyberjack_read_bulk_callback (struct urb *urb) ...@@ -387,7 +387,7 @@ static void cyberjack_read_bulk_callback (struct urb *urb)
/* Continue to read if we have still urbs to do. */ /* Continue to read if we have still urbs to do. */
if( priv->rdtodo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) { if( priv->rdtodo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) {
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
dbg(__FUNCTION__ " - usb_submit_urb(read urb)"); dbg(__FUNCTION__ " - usb_submit_urb(read urb)");
...@@ -440,7 +440,7 @@ static void cyberjack_write_bulk_callback (struct urb *urb) ...@@ -440,7 +440,7 @@ static void cyberjack_write_bulk_callback (struct urb *urb)
port); port);
/* send the data out the bulk port */ /* send the data out the bulk port */
result = usb_submit_urb(port->write_urb, GFP_KERNEL); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) { if (result) {
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
/* Throw away data. No better idea what to do with it. */ /* Throw away data. No better idea what to do with it. */
......
...@@ -676,7 +676,7 @@ dbg( "digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, co ...@@ -676,7 +676,7 @@ dbg( "digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, co
oob_port->write_urb->transfer_buffer_length = len; oob_port->write_urb->transfer_buffer_length = len;
oob_port->write_urb->dev = port->serial->dev; oob_port->write_urb->dev = port->serial->dev;
if( (ret=usb_submit_urb(oob_port->write_urb, GFP_KERNEL)) == 0 ) { if( (ret=usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0 ) {
oob_priv->dp_write_urb_in_use = 1; oob_priv->dp_write_urb_in_use = 1;
count -= len; count -= len;
buf += len; buf += len;
...@@ -764,7 +764,7 @@ count ); ...@@ -764,7 +764,7 @@ count );
} }
port->write_urb->dev = port->serial->dev; port->write_urb->dev = port->serial->dev;
if( (ret=usb_submit_urb(port->write_urb, GFP_KERNEL)) == 0 ) { if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
priv->dp_write_urb_in_use = 1; priv->dp_write_urb_in_use = 1;
priv->dp_out_buf_len = 0; priv->dp_out_buf_len = 0;
count -= len; count -= len;
...@@ -841,7 +841,7 @@ port_priv->dp_port_num, modem_signals ); ...@@ -841,7 +841,7 @@ port_priv->dp_port_num, modem_signals );
oob_port->write_urb->transfer_buffer_length = 8; oob_port->write_urb->transfer_buffer_length = 8;
oob_port->write_urb->dev = port->serial->dev; oob_port->write_urb->dev = port->serial->dev;
if( (ret=usb_submit_urb(oob_port->write_urb, GFP_KERNEL)) == 0 ) { if( (ret=usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0 ) {
oob_priv->dp_write_urb_in_use = 1; oob_priv->dp_write_urb_in_use = 1;
port_priv->dp_modem_signals = port_priv->dp_modem_signals =
(port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS)) (port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS))
...@@ -962,7 +962,7 @@ dbg( "digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num ); ...@@ -962,7 +962,7 @@ dbg( "digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num );
/* restart read chain */ /* restart read chain */
if( priv->dp_throttle_restart ) { if( priv->dp_throttle_restart ) {
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
ret = usb_submit_urb( port->read_urb, GFP_KERNEL ); ret = usb_submit_urb( port->read_urb, GFP_ATOMIC );
} }
/* turn throttle off */ /* turn throttle off */
...@@ -1323,7 +1323,7 @@ priv->dp_port_num, count, from_user, in_interrupt() ); ...@@ -1323,7 +1323,7 @@ priv->dp_port_num, count, from_user, in_interrupt() );
/* copy in new data */ /* copy in new data */
memcpy( data, from_user ? user_buf : buf, new_len ); memcpy( data, from_user ? user_buf : buf, new_len );
if( (ret=usb_submit_urb(port->write_urb, GFP_KERNEL)) == 0 ) { if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
priv->dp_write_urb_in_use = 1; priv->dp_write_urb_in_use = 1;
ret = new_len; ret = new_len;
priv->dp_out_buf_len = 0; priv->dp_out_buf_len = 0;
...@@ -1399,7 +1399,7 @@ dbg( "digi_write_bulk_callback: TOP, urb->status=%d", urb->status ); ...@@ -1399,7 +1399,7 @@ dbg( "digi_write_bulk_callback: TOP, urb->status=%d", urb->status );
memcpy( port->write_urb->transfer_buffer+2, priv->dp_out_buf, memcpy( port->write_urb->transfer_buffer+2, priv->dp_out_buf,
priv->dp_out_buf_len ); priv->dp_out_buf_len );
if( (ret=usb_submit_urb(port->write_urb, GFP_KERNEL)) == 0 ) { if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
priv->dp_write_urb_in_use = 1; priv->dp_write_urb_in_use = 1;
priv->dp_out_buf_len = 0; priv->dp_out_buf_len = 0;
} }
...@@ -1837,7 +1837,7 @@ dbg( "digi_read_bulk_callback: TOP" ); ...@@ -1837,7 +1837,7 @@ dbg( "digi_read_bulk_callback: TOP" );
/* continue read */ /* continue read */
urb->dev = port->serial->dev; urb->dev = port->serial->dev;
if( (ret=usb_submit_urb(urb, GFP_KERNEL)) != 0 ) { if( (ret=usb_submit_urb(urb, GFP_ATOMIC)) != 0 ) {
err( __FUNCTION__ ": failed resubmitting urb, ret=%d, port=%d", err( __FUNCTION__ ": failed resubmitting urb, ret=%d, port=%d",
ret, priv->dp_port_num ); ret, priv->dp_port_num );
} }
......
...@@ -256,7 +256,7 @@ static int empeg_write (struct usb_serial_port *port, int from_user, const unsig ...@@ -256,7 +256,7 @@ static int empeg_write (struct usb_serial_port *port, int from_user, const unsig
} }
if (urb->transfer_buffer == NULL) { if (urb->transfer_buffer == NULL) {
urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
if (urb->transfer_buffer == NULL) { if (urb->transfer_buffer == NULL) {
err(__FUNCTION__" no more kernel memory..."); err(__FUNCTION__" no more kernel memory...");
goto exit; goto exit;
...@@ -288,7 +288,7 @@ static int empeg_write (struct usb_serial_port *port, int from_user, const unsig ...@@ -288,7 +288,7 @@ static int empeg_write (struct usb_serial_port *port, int from_user, const unsig
urb->transfer_flags |= USB_QUEUE_BULK; urb->transfer_flags |= USB_QUEUE_BULK;
/* send it down the pipe */ /* send it down the pipe */
status = usb_submit_urb(urb, GFP_KERNEL); status = usb_submit_urb(urb, GFP_ATOMIC);
if (status) { if (status) {
err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status); err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status);
bytes_sent = status; bytes_sent = status;
...@@ -441,7 +441,7 @@ static void empeg_read_bulk_callback (struct urb *urb) ...@@ -441,7 +441,7 @@ static void empeg_read_bulk_callback (struct urb *urb)
port->read_urb->transfer_flags |= USB_QUEUE_BULK; port->read_urb->transfer_flags |= USB_QUEUE_BULK;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
...@@ -466,7 +466,7 @@ static void empeg_unthrottle (struct usb_serial_port *port) ...@@ -466,7 +466,7 @@ static void empeg_unthrottle (struct usb_serial_port *port)
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed submitting read urb, error %d", result); err(__FUNCTION__ " - failed submitting read urb, error %d", result);
......
...@@ -469,7 +469,7 @@ static int ftdi_sio_write (struct usb_serial_port *port, int from_user, ...@@ -469,7 +469,7 @@ static int ftdi_sio_write (struct usb_serial_port *port, int from_user,
port->write_urb->transfer_buffer, count, port->write_urb->transfer_buffer, count,
ftdi_sio_write_bulk_callback, port); ftdi_sio_write_bulk_callback, port);
result = usb_submit_urb(port->write_urb, GFP_KERNEL); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) { if (result) {
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
return 0; return 0;
...@@ -631,7 +631,7 @@ static void ftdi_sio_read_bulk_callback (struct urb *urb) ...@@ -631,7 +631,7 @@ static void ftdi_sio_read_bulk_callback (struct urb *urb)
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
ftdi_sio_read_bulk_callback, port); ftdi_sio_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
......
...@@ -790,7 +790,7 @@ static void edge_interrupt_callback (struct urb *urb) ...@@ -790,7 +790,7 @@ static void edge_interrupt_callback (struct urb *urb)
/* we have pending bytes on the bulk in pipe, send a request */ /* we have pending bytes on the bulk in pipe, send a request */
edge_serial->read_urb->dev = edge_serial->serial->dev; edge_serial->read_urb->dev = edge_serial->serial->dev;
result = usb_submit_urb(edge_serial->read_urb, GFP_KERNEL); result = usb_submit_urb(edge_serial->read_urb, GFP_ATOMIC);
if (result) { if (result) {
dbg(__FUNCTION__" - usb_submit_urb(read bulk) failed with result = %d", result); dbg(__FUNCTION__" - usb_submit_urb(read bulk) failed with result = %d", result);
} }
...@@ -867,7 +867,7 @@ static void edge_bulk_in_callback (struct urb *urb) ...@@ -867,7 +867,7 @@ static void edge_bulk_in_callback (struct urb *urb)
/* there is, so resubmit our urb */ /* there is, so resubmit our urb */
edge_serial->read_urb->dev = edge_serial->serial->dev; edge_serial->read_urb->dev = edge_serial->serial->dev;
status = usb_submit_urb(edge_serial->read_urb, GFP_KERNEL); status = usb_submit_urb(edge_serial->read_urb, GFP_ATOMIC);
if (status) { if (status) {
err(__FUNCTION__" - usb_submit_urb(read bulk) failed, status = %d", status); err(__FUNCTION__" - usb_submit_urb(read bulk) failed, status = %d", status);
} }
...@@ -1435,7 +1435,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge ...@@ -1435,7 +1435,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge
/* build the data header for the buffer and port that we are about to send out */ /* build the data header for the buffer and port that we are about to send out */
count = fifo->count; count = fifo->count;
buffer = kmalloc (count+2, GFP_KERNEL); buffer = kmalloc (count+2, GFP_ATOMIC);
if (buffer == NULL) { if (buffer == NULL) {
err(__FUNCTION__" - no more kernel memory..."); err(__FUNCTION__" - no more kernel memory...");
edge_port->write_in_progress = FALSE; edge_port->write_in_progress = FALSE;
...@@ -1474,7 +1474,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge ...@@ -1474,7 +1474,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge
urb->transfer_flags |= USB_QUEUE_BULK; urb->transfer_flags |= USB_QUEUE_BULK;
urb->dev = edge_serial->serial->dev; urb->dev = edge_serial->serial->dev;
status = usb_submit_urb(urb, GFP_KERNEL); status = usb_submit_urb(urb, GFP_ATOMIC);
if (status) { if (status) {
/* something went wrong */ /* something went wrong */
dbg(__FUNCTION__" - usb_submit_urb(write bulk) failed"); dbg(__FUNCTION__" - usb_submit_urb(write bulk) failed");
...@@ -2431,7 +2431,7 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u ...@@ -2431,7 +2431,7 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u
dbg(__FUNCTION__" - %d, %d", command, param); dbg(__FUNCTION__" - %d, %d", command, param);
buffer = kmalloc (10, GFP_KERNEL); buffer = kmalloc (10, GFP_ATOMIC);
if (!buffer) { if (!buffer) {
err(__FUNCTION__" - kmalloc(%d) failed.\n", 10); err(__FUNCTION__" - kmalloc(%d) failed.\n", 10);
return -ENOMEM; return -ENOMEM;
...@@ -2467,7 +2467,7 @@ static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer ...@@ -2467,7 +2467,7 @@ static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer
usb_serial_debug_data (__FILE__, __FUNCTION__, length, buffer); usb_serial_debug_data (__FILE__, __FUNCTION__, length, buffer);
/* Allocate our next urb */ /* Allocate our next urb */
urb = usb_alloc_urb (0, GFP_KERNEL); urb = usb_alloc_urb (0, GFP_ATOMIC);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
...@@ -2482,7 +2482,7 @@ static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer ...@@ -2482,7 +2482,7 @@ static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer
urb->transfer_flags |= USB_QUEUE_BULK; urb->transfer_flags |= USB_QUEUE_BULK;
edge_port->commandPending = TRUE; edge_port->commandPending = TRUE;
status = usb_submit_urb(urb, GFP_KERNEL); status = usb_submit_urb(urb, GFP_ATOMIC);
if (status) { if (status) {
/* something went wrong */ /* something went wrong */
...@@ -2532,7 +2532,7 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa ...@@ -2532,7 +2532,7 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa
} }
// Alloc memory for the string of commands. // Alloc memory for the string of commands.
cmdBuffer = kmalloc (0x100, GFP_KERNEL); cmdBuffer = kmalloc (0x100, GFP_ATOMIC);
if (!cmdBuffer) { if (!cmdBuffer) {
err(__FUNCTION__" - kmalloc(%d) failed.\n", 0x100); err(__FUNCTION__" - kmalloc(%d) failed.\n", 0x100);
return -ENOMEM; return -ENOMEM;
...@@ -2618,7 +2618,7 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r ...@@ -2618,7 +2618,7 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r
dbg (__FUNCTION__" - write to %s register 0x%02x", (regNum == MCR) ? "MCR" : "LCR", regValue); dbg (__FUNCTION__" - write to %s register 0x%02x", (regNum == MCR) ? "MCR" : "LCR", regValue);
// Alloc memory for the string of commands. // Alloc memory for the string of commands.
cmdBuffer = kmalloc (0x10, GFP_KERNEL); cmdBuffer = kmalloc (0x10, GFP_ATOMIC);
if (cmdBuffer == NULL ) { if (cmdBuffer == NULL ) {
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -297,7 +297,7 @@ static void ipaq_read_bulk_callback(struct urb *urb) ...@@ -297,7 +297,7 @@ static void ipaq_read_bulk_callback(struct urb *urb)
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
ipaq_read_bulk_callback, port); ipaq_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
return; return;
...@@ -412,7 +412,7 @@ static int ipaq_write_flush(struct usb_serial_port *port) ...@@ -412,7 +412,7 @@ static int ipaq_write_flush(struct usb_serial_port *port)
usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback, port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback,
port); port);
result = usb_submit_urb(urb, GFP_KERNEL); result = usb_submit_urb(urb, GFP_ATOMIC);
if (result) { if (result) {
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
} }
......
...@@ -405,7 +405,7 @@ static int ir_write (struct usb_serial_port *port, int from_user, const unsigned ...@@ -405,7 +405,7 @@ static int ir_write (struct usb_serial_port *port, int from_user, const unsigned
= USB_QUEUE_BULK = USB_QUEUE_BULK
| USB_ZERO_PACKET; | USB_ZERO_PACKET;
result = usb_submit_urb (port->write_urb, GFP_KERNEL); result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
if (result) if (result)
err("%s - failed submitting write urb, error %d", __FUNCTION__, result); err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
else else
...@@ -515,7 +515,7 @@ static void ir_read_bulk_callback (struct urb *urb) ...@@ -515,7 +515,7 @@ static void ir_read_bulk_callback (struct urb *urb)
port->read_urb->transfer_flags = USB_QUEUE_BULK; port->read_urb->transfer_flags = USB_QUEUE_BULK;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err("%s - failed resubmitting read urb, error %d", err("%s - failed resubmitting read urb, error %d",
......
...@@ -378,7 +378,7 @@ static int keyspan_write(struct usb_serial_port *port, int from_user, ...@@ -378,7 +378,7 @@ static int keyspan_write(struct usb_serial_port *port, int from_user,
this_urb->transfer_flags &= ~USB_ASYNC_UNLINK; this_urb->transfer_flags &= ~USB_ASYNC_UNLINK;
this_urb->dev = port->serial->dev; this_urb->dev = port->serial->dev;
if ((err = usb_submit_urb(this_urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
dbg("usb_submit_urb(write bulk) failed (%d)\n", err); dbg("usb_submit_urb(write bulk) failed (%d)\n", err);
} }
p_priv->tx_start_time[flip] = jiffies; p_priv->tx_start_time[flip] = jiffies;
...@@ -436,7 +436,7 @@ static void usa26_indat_callback(struct urb *urb) ...@@ -436,7 +436,7 @@ static void usa26_indat_callback(struct urb *urb)
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev; urb->dev = port->serial->dev;
if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err); dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err);
} }
return; return;
...@@ -535,7 +535,7 @@ static void usa26_instat_callback(struct urb *urb) ...@@ -535,7 +535,7 @@ static void usa26_instat_callback(struct urb *urb)
exit: exit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
urb->dev = serial->dev; urb->dev = serial->dev;
if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err); dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err);
} }
} }
...@@ -586,7 +586,7 @@ static void usa28_indat_callback(struct urb *urb) ...@@ -586,7 +586,7 @@ static void usa28_indat_callback(struct urb *urb)
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev; urb->dev = port->serial->dev;
if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n",
err); err);
} }
...@@ -671,7 +671,7 @@ static void usa28_instat_callback(struct urb *urb) ...@@ -671,7 +671,7 @@ static void usa28_instat_callback(struct urb *urb)
exit: exit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
urb->dev = serial->dev; urb->dev = serial->dev;
if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err); dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err);
} }
} }
...@@ -764,7 +764,7 @@ static void usa49_instat_callback(struct urb *urb) ...@@ -764,7 +764,7 @@ static void usa49_instat_callback(struct urb *urb)
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
urb->dev = serial->dev; urb->dev = serial->dev;
if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err); dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err);
} }
} }
...@@ -819,7 +819,7 @@ static void usa49_indat_callback(struct urb *urb) ...@@ -819,7 +819,7 @@ static void usa49_indat_callback(struct urb *urb)
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev; urb->dev = port->serial->dev;
if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err); dbg(__FUNCTION__ "resubmit read urb failed. (%d)\n", err);
} }
} }
......
...@@ -292,7 +292,7 @@ static void keyspan_pda_rx_unthrottle (struct usb_serial_port *port) ...@@ -292,7 +292,7 @@ static void keyspan_pda_rx_unthrottle (struct usb_serial_port *port)
/* just restart the receive interrupt URB */ /* just restart the receive interrupt URB */
dbg("keyspan_pda_rx_unthrottle port %d", port->number); dbg("keyspan_pda_rx_unthrottle port %d", port->number);
port->interrupt_in_urb->dev = port->serial->dev; port->interrupt_in_urb->dev = port->serial->dev;
if (usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL)) if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC))
dbg(" usb_submit_urb(read urb) failed"); dbg(" usb_submit_urb(read urb) failed");
return; return;
} }
...@@ -584,7 +584,7 @@ static int keyspan_pda_write(struct usb_serial_port *port, int from_user, ...@@ -584,7 +584,7 @@ static int keyspan_pda_write(struct usb_serial_port *port, int from_user,
priv->tx_room -= count; priv->tx_room -= count;
port->write_urb->dev = port->serial->dev; port->write_urb->dev = port->serial->dev;
rc = usb_submit_urb(port->write_urb, GFP_KERNEL); rc = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (rc) { if (rc) {
dbg(" usb_submit_urb(write bulk) failed"); dbg(" usb_submit_urb(write bulk) failed");
goto exit; goto exit;
......
...@@ -519,7 +519,7 @@ static int klsi_105_write (struct usb_serial_port *port, int from_user, ...@@ -519,7 +519,7 @@ static int klsi_105_write (struct usb_serial_port *port, int from_user,
} }
if (urb->transfer_buffer == NULL) { if (urb->transfer_buffer == NULL) {
urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
if (urb->transfer_buffer == NULL) { if (urb->transfer_buffer == NULL) {
err(__FUNCTION__ " - no more kernel memory..."); err(__FUNCTION__ " - no more kernel memory...");
goto exit; goto exit;
...@@ -555,7 +555,7 @@ static int klsi_105_write (struct usb_serial_port *port, int from_user, ...@@ -555,7 +555,7 @@ static int klsi_105_write (struct usb_serial_port *port, int from_user,
/* send the data out the bulk port */ /* send the data out the bulk port */
result = usb_submit_urb(urb, GFP_KERNEL); result = usb_submit_urb(urb, GFP_ATOMIC);
if (result) { if (result) {
err(__FUNCTION__ err(__FUNCTION__
" - failed submitting write urb, error %d", result); " - failed submitting write urb, error %d", result);
...@@ -721,7 +721,7 @@ static void klsi_105_read_bulk_callback (struct urb *urb) ...@@ -721,7 +721,7 @@ static void klsi_105_read_bulk_callback (struct urb *urb)
port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer_length,
klsi_105_read_bulk_callback, klsi_105_read_bulk_callback,
port); port);
rc = usb_submit_urb(port->read_urb, GFP_KERNEL); rc = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (rc) if (rc)
err(__FUNCTION__ err(__FUNCTION__
" - failed resubmitting read urb, error %d", rc); " - failed resubmitting read urb, error %d", rc);
...@@ -1019,7 +1019,7 @@ static void klsi_105_unthrottle (struct usb_serial_port *port) ...@@ -1019,7 +1019,7 @@ static void klsi_105_unthrottle (struct usb_serial_port *port)
dbg(__FUNCTION__ " - port %d", port->number); dbg(__FUNCTION__ " - port %d", port->number);
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed submitting read urb, error %d", err(__FUNCTION__ " - failed submitting read urb, error %d",
result); result);
......
...@@ -470,7 +470,7 @@ static int mct_u232_write (struct usb_serial_port *port, int from_user, ...@@ -470,7 +470,7 @@ static int mct_u232_write (struct usb_serial_port *port, int from_user,
port); port);
/* send the data out the bulk port */ /* send the data out the bulk port */
result = usb_submit_urb(port->write_urb, GFP_KERNEL); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) { if (result) {
err(__FUNCTION__ err(__FUNCTION__
" - failed submitting write urb, error %d", result); " - failed submitting write urb, error %d", result);
......
...@@ -265,7 +265,7 @@ static void omninet_read_bulk_callback (struct urb *urb) ...@@ -265,7 +265,7 @@ static void omninet_read_bulk_callback (struct urb *urb)
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
urb->transfer_buffer, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_buffer_length,
omninet_read_bulk_callback, port); omninet_read_bulk_callback, port);
result = usb_submit_urb(urb, GFP_KERNEL); result = usb_submit_urb(urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
...@@ -316,7 +316,7 @@ static int omninet_write (struct usb_serial_port *port, int from_user, const uns ...@@ -316,7 +316,7 @@ static int omninet_write (struct usb_serial_port *port, int from_user, const uns
wport->write_urb->transfer_buffer_length = 64; wport->write_urb->transfer_buffer_length = 64;
wport->write_urb->dev = serial->dev; wport->write_urb->dev = serial->dev;
result = usb_submit_urb(wport->write_urb, GFP_KERNEL); result = usb_submit_urb(wport->write_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
else else
......
...@@ -195,7 +195,7 @@ static int pl2303_write (struct usb_serial_port *port, int from_user, const uns ...@@ -195,7 +195,7 @@ static int pl2303_write (struct usb_serial_port *port, int from_user, const uns
port->write_urb->transfer_buffer_length = count; port->write_urb->transfer_buffer_length = count;
port->write_urb->dev = port->serial->dev; port->write_urb->dev = port->serial->dev;
result = usb_submit_urb (port->write_urb, GFP_KERNEL); result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
else else
...@@ -643,7 +643,7 @@ static void pl2303_read_bulk_callback (struct urb *urb) ...@@ -643,7 +643,7 @@ static void pl2303_read_bulk_callback (struct urb *urb)
dbg (__FUNCTION__ " - caught -EPROTO, resubmitting the urb"); dbg (__FUNCTION__ " - caught -EPROTO, resubmitting the urb");
urb->status = 0; urb->status = 0;
urb->dev = serial->dev; urb->dev = serial->dev;
result = usb_submit_urb(urb, GFP_KERNEL); result = usb_submit_urb(urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
return; return;
...@@ -668,7 +668,7 @@ static void pl2303_read_bulk_callback (struct urb *urb) ...@@ -668,7 +668,7 @@ static void pl2303_read_bulk_callback (struct urb *urb)
/* Schedule the next read _if_ we are still open */ /* Schedule the next read _if_ we are still open */
if (port->open_count) { if (port->open_count) {
urb->dev = serial->dev; urb->dev = serial->dev;
result = usb_submit_urb(urb, GFP_KERNEL); result = usb_submit_urb(urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
} }
...@@ -697,7 +697,7 @@ static void pl2303_write_bulk_callback (struct urb *urb) ...@@ -697,7 +697,7 @@ static void pl2303_write_bulk_callback (struct urb *urb)
dbg (__FUNCTION__ " - nonzero write bulk status received: %d", urb->status); dbg (__FUNCTION__ " - nonzero write bulk status received: %d", urb->status);
port->write_urb->transfer_buffer_length = 1; port->write_urb->transfer_buffer_length = 1;
port->write_urb->dev = port->serial->dev; port->write_urb->dev = port->serial->dev;
result = usb_submit_urb (port->write_urb, GFP_KERNEL); result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting write urb, error %d", result); err(__FUNCTION__ " - failed resubmitting write urb, error %d", result);
......
...@@ -899,7 +899,7 @@ static int generic_write (struct usb_serial_port *port, int from_user, const uns ...@@ -899,7 +899,7 @@ static int generic_write (struct usb_serial_port *port, int from_user, const uns
generic_write_bulk_callback), port); generic_write_bulk_callback), port);
/* send the data out the bulk port */ /* send the data out the bulk port */
result = usb_submit_urb(port->write_urb, GFP_KERNEL); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed submitting write urb, error %d", result); err(__FUNCTION__ " - failed submitting write urb, error %d", result);
else else
...@@ -989,7 +989,7 @@ static void generic_read_bulk_callback (struct urb *urb) ...@@ -989,7 +989,7 @@ static void generic_read_bulk_callback (struct urb *urb)
((serial->type->read_bulk_callback) ? ((serial->type->read_bulk_callback) ?
serial->type->read_bulk_callback : serial->type->read_bulk_callback :
generic_read_bulk_callback), port); generic_read_bulk_callback), port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
} }
......
...@@ -344,13 +344,13 @@ static int visor_write (struct usb_serial_port *port, int from_user, const unsig ...@@ -344,13 +344,13 @@ static int visor_write (struct usb_serial_port *port, int from_user, const unsig
dbg(__FUNCTION__ " - port %d", port->number); dbg(__FUNCTION__ " - port %d", port->number);
buffer = kmalloc (count, GFP_KERNEL); buffer = kmalloc (count, GFP_ATOMIC);
if (!buffer) { if (!buffer) {
err ("out of memory"); err ("out of memory");
return -ENOMEM; return -ENOMEM;
} }
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) { if (!urb) {
err ("no more free urbs"); err ("no more free urbs");
kfree (buffer); kfree (buffer);
...@@ -377,7 +377,7 @@ static int visor_write (struct usb_serial_port *port, int from_user, const unsig ...@@ -377,7 +377,7 @@ static int visor_write (struct usb_serial_port *port, int from_user, const unsig
urb->transfer_flags |= USB_QUEUE_BULK; urb->transfer_flags |= USB_QUEUE_BULK;
/* send it down the pipe */ /* send it down the pipe */
status = usb_submit_urb(urb, GFP_KERNEL); status = usb_submit_urb(urb, GFP_ATOMIC);
if (status) { if (status) {
err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status); err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status);
count = status; count = status;
...@@ -491,7 +491,7 @@ static void visor_read_bulk_callback (struct urb *urb) ...@@ -491,7 +491,7 @@ static void visor_read_bulk_callback (struct urb *urb)
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer_length,
visor_read_bulk_callback, port); visor_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed resubmitting read urb, error %d", result); err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
return; return;
...@@ -512,7 +512,7 @@ static void visor_unthrottle (struct usb_serial_port *port) ...@@ -512,7 +512,7 @@ static void visor_unthrottle (struct usb_serial_port *port)
dbg(__FUNCTION__ " - port %d", port->number); dbg(__FUNCTION__ " - port %d", port->number);
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err(__FUNCTION__ " - failed submitting read urb, error %d", result); err(__FUNCTION__ " - failed submitting read urb, error %d", result);
} }
......
...@@ -240,7 +240,7 @@ static void command_port_read_callback (struct urb *urb) ...@@ -240,7 +240,7 @@ static void command_port_read_callback (struct urb *urb)
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
command_port_read_callback, port); command_port_read_callback, port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
dbg(__FUNCTION__ " - failed resubmitting read urb, error %d", result); dbg(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
} }
......
...@@ -6,7 +6,226 @@ ...@@ -6,7 +6,226 @@
* table of configured filesystems * table of configured filesystems
*/ */
#include <linux/config.h>
#include <linux/slab.h>
#include <linux/kmod.h>
#define __NO_VERSION__
#include <linux/module.h>
#include <asm/uaccess.h>
/*
* Handling of filesystem drivers list.
* Rules:
* Inclusion to/removals from/scanning of list are protected by spinlock.
* During the unload module must call unregister_filesystem().
* We can access the fields of list element if:
* 1) spinlock is held or
* 2) we hold the reference to the module.
* The latter can be guaranteed by call of try_inc_mod_count(); if it
* returned 0 we must skip the element, otherwise we got the reference.
* Once the reference is obtained we can drop the spinlock.
*/
static struct file_system_type *file_systems;
static rwlock_t file_systems_lock = RW_LOCK_UNLOCKED;
/* WARNING: This can be used only if we _already_ own a reference */
void get_filesystem(struct file_system_type *fs)
{
if (fs->owner)
__MOD_INC_USE_COUNT(fs->owner);
}
void put_filesystem(struct file_system_type *fs)
{
if (fs->owner)
__MOD_DEC_USE_COUNT(fs->owner);
}
static struct file_system_type **find_filesystem(const char *name)
{
struct file_system_type **p;
for (p=&file_systems; *p; p=&(*p)->next)
if (strcmp((*p)->name,name) == 0)
break;
return p;
}
/**
* register_filesystem - register a new filesystem
* @fs: the file system structure
*
* Adds the file system passed to the list of file systems the kernel
* is aware of for mount and other syscalls. Returns 0 on success,
* or a negative errno code on an error.
*
* The &struct file_system_type that is passed is linked into the kernel
* structures and must not be freed until the file system has been
* unregistered.
*/
int register_filesystem(struct file_system_type * fs)
{
int res = 0;
struct file_system_type ** p;
if (!fs)
return -EINVAL;
if (fs->next)
return -EBUSY;
INIT_LIST_HEAD(&fs->fs_supers);
write_lock(&file_systems_lock);
p = find_filesystem(fs->name);
if (*p)
res = -EBUSY;
else
*p = fs;
write_unlock(&file_systems_lock);
return res;
}
/**
* unregister_filesystem - unregister a file system
* @fs: filesystem to unregister
*
* Remove a file system that was previously successfully registered
* with the kernel. An error is returned if the file system is not found.
* Zero is returned on a success.
*
* Once this function has returned the &struct file_system_type structure
* may be freed or reused.
*/
int unregister_filesystem(struct file_system_type * fs)
{
struct file_system_type ** tmp;
write_lock(&file_systems_lock);
tmp = &file_systems;
while (*tmp) {
if (fs == *tmp) {
*tmp = fs->next;
fs->next = NULL;
write_unlock(&file_systems_lock);
return 0;
}
tmp = &(*tmp)->next;
}
write_unlock(&file_systems_lock);
return -EINVAL;
}
static int fs_index(const char * __name)
{
struct file_system_type * tmp;
char * name;
int err, index;
name = getname(__name);
err = PTR_ERR(name);
if (IS_ERR(name))
return err;
err = -EINVAL;
read_lock(&file_systems_lock);
for (tmp=file_systems, index=0 ; tmp ; tmp=tmp->next, index++) {
if (strcmp(tmp->name,name) == 0) {
err = index;
break;
}
}
read_unlock(&file_systems_lock);
putname(name);
return err;
}
static int fs_name(unsigned int index, char * buf)
{
struct file_system_type * tmp;
int len, res;
read_lock(&file_systems_lock);
for (tmp = file_systems; tmp; tmp = tmp->next, index--)
if (index <= 0 && try_inc_mod_count(tmp->owner))
break;
read_unlock(&file_systems_lock);
if (!tmp)
return -EINVAL;
/* OK, we got the reference, so we can safely block */
len = strlen(tmp->name) + 1;
res = copy_to_user(buf, tmp->name, len) ? -EFAULT : 0;
put_filesystem(tmp);
return res;
}
static int fs_maxindex(void)
{
struct file_system_type * tmp;
int index;
read_lock(&file_systems_lock);
for (tmp = file_systems, index = 0 ; tmp ; tmp = tmp->next, index++)
;
read_unlock(&file_systems_lock);
return index;
}
/* /*
* Code will move here from fs/super.c and yes, it will be fs type handling * Whee.. Weird sysv syscall.
* stuff.
*/ */
asmlinkage long sys_sysfs(int option, unsigned long arg1, unsigned long arg2)
{
int retval = -EINVAL;
switch (option) {
case 1:
retval = fs_index((const char *) arg1);
break;
case 2:
retval = fs_name(arg1, (char *) arg2);
break;
case 3:
retval = fs_maxindex();
break;
}
return retval;
}
int get_filesystem_list(char * buf)
{
int len = 0;
struct file_system_type * tmp;
read_lock(&file_systems_lock);
tmp = file_systems;
while (tmp && len < PAGE_SIZE - 80) {
len += sprintf(buf+len, "%s\t%s\n",
(tmp->fs_flags & FS_REQUIRES_DEV) ? "" : "nodev",
tmp->name);
tmp = tmp->next;
}
read_unlock(&file_systems_lock);
return len;
}
struct file_system_type *get_fs_type(const char *name)
{
struct file_system_type *fs;
read_lock(&file_systems_lock);
fs = *(find_filesystem(name));
if (fs && !try_inc_mod_count(fs->owner))
fs = NULL;
read_unlock(&file_systems_lock);
if (!fs && (request_module(name) == 0)) {
read_lock(&file_systems_lock);
fs = *(find_filesystem(name));
if (fs && !try_inc_mod_count(fs->owner))
fs = NULL;
read_unlock(&file_systems_lock);
}
return fs;
}
...@@ -110,14 +110,13 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -110,14 +110,13 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
struct buffer_head *bh = NULL; struct buffer_head *bh = NULL;
int len; int len;
int map; int map;
int high_sierra;
int first_de = 1; int first_de = 1;
char *p = NULL; /* Quiet GCC */ char *p = NULL; /* Quiet GCC */
struct iso_directory_record *de; struct iso_directory_record *de;
struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb);
offset = filp->f_pos & (bufsize - 1); offset = filp->f_pos & (bufsize - 1);
block = filp->f_pos >> bufbits; block = filp->f_pos >> bufbits;
high_sierra = inode->i_sb->u.isofs_sb.s_high_sierra;
while (filp->f_pos < inode->i_size) { while (filp->f_pos < inode->i_size) {
int de_len; int de_len;
...@@ -166,7 +165,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -166,7 +165,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
de = tmpde; de = tmpde;
} }
if (de->flags[-high_sierra] & 0x80) { if (de->flags[-sbi->s_high_sierra] & 0x80) {
first_de = 0; first_de = 0;
filp->f_pos += de_len; filp->f_pos += de_len;
continue; continue;
...@@ -194,16 +193,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -194,16 +193,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
/* Handle everything else. Do name translation if there /* Handle everything else. Do name translation if there
is no Rock Ridge NM field. */ is no Rock Ridge NM field. */
if (inode->i_sb->u.isofs_sb.s_unhide == 'n') { if (sbi->s_unhide == 'n') {
/* Do not report hidden or associated files */ /* Do not report hidden or associated files */
if (de->flags[-high_sierra] & 5) { if (de->flags[-sbi->s_high_sierra] & 5) {
filp->f_pos += de_len; filp->f_pos += de_len;
continue; continue;
} }
} }
map = 1; map = 1;
if (inode->i_sb->u.isofs_sb.s_rock) { if (sbi->s_rock) {
len = get_rock_ridge_filename(de, tmpname, inode); len = get_rock_ridge_filename(de, tmpname, inode);
if (len != 0) { /* may be -1 */ if (len != 0) { /* may be -1 */
p = tmpname; p = tmpname;
...@@ -212,16 +211,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -212,16 +211,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
} }
if (map) { if (map) {
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
if (inode->i_sb->u.isofs_sb.s_joliet_level) { if (sbi->s_joliet_level) {
len = get_joliet_filename(de, tmpname, inode); len = get_joliet_filename(de, tmpname, inode);
p = tmpname; p = tmpname;
} else } else
#endif #endif
if (inode->i_sb->u.isofs_sb.s_mapping == 'a') { if (sbi->s_mapping == 'a') {
len = get_acorn_filename(de, tmpname, inode); len = get_acorn_filename(de, tmpname, inode);
p = tmpname; p = tmpname;
} else } else
if (inode->i_sb->u.isofs_sb.s_mapping == 'n') { if (sbi->s_mapping == 'n') {
len = isofs_name_translate(de, tmpname, inode); len = isofs_name_translate(de, tmpname, inode);
p = tmpname; p = tmpname;
} else { } else {
......
This diff is collapsed.
...@@ -77,8 +77,8 @@ get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, st ...@@ -77,8 +77,8 @@ get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, st
struct nls_table *nls; struct nls_table *nls;
unsigned char len = 0; unsigned char len = 0;
utf8 = inode->i_sb->u.isofs_sb.s_utf8; utf8 = ISOFS_SB(inode->i_sb)->s_utf8;
nls = inode->i_sb->u.isofs_sb.s_nls_iocharset; nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset;
if (utf8) { if (utf8) {
len = wcsntombs_be(outname, de->name, len = wcsntombs_be(outname, de->name,
......
...@@ -65,6 +65,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, ...@@ -65,6 +65,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
unsigned char bufbits = ISOFS_BUFFER_BITS(dir); unsigned char bufbits = ISOFS_BUFFER_BITS(dir);
unsigned int block, f_pos, offset; unsigned int block, f_pos, offset;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb);
if (!ISOFS_I(dir)->i_first_extent) if (!ISOFS_I(dir)->i_first_extent)
return 0; return 0;
...@@ -120,19 +121,19 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, ...@@ -120,19 +121,19 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
dlen = de->name_len[0]; dlen = de->name_len[0];
dpnt = de->name; dpnt = de->name;
if (dir->i_sb->u.isofs_sb.s_rock && if (sbi->s_rock &&
((i = get_rock_ridge_filename(de, tmpname, dir)))) { ((i = get_rock_ridge_filename(de, tmpname, dir)))) {
dlen = i; /* possibly -1 */ dlen = i; /* possibly -1 */
dpnt = tmpname; dpnt = tmpname;
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
} else if (dir->i_sb->u.isofs_sb.s_joliet_level) { } else if (sbi->s_joliet_level) {
dlen = get_joliet_filename(de, tmpname, dir); dlen = get_joliet_filename(de, tmpname, dir);
dpnt = tmpname; dpnt = tmpname;
#endif #endif
} else if (dir->i_sb->u.isofs_sb.s_mapping == 'a') { } else if (sbi->s_mapping == 'a') {
dlen = get_acorn_filename(de, tmpname, dir); dlen = get_acorn_filename(de, tmpname, dir);
dpnt = tmpname; dpnt = tmpname;
} else if (dir->i_sb->u.isofs_sb.s_mapping == 'n') { } else if (sbi->s_mapping == 'n') {
dlen = isofs_name_translate(de, tmpname, dir); dlen = isofs_name_translate(de, tmpname, dir);
dpnt = tmpname; dpnt = tmpname;
} }
...@@ -142,8 +143,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, ...@@ -142,8 +143,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
*/ */
match = 0; match = 0;
if (dlen > 0 && if (dlen > 0 &&
(!(de->flags[-dir->i_sb->u.isofs_sb.s_high_sierra] & 5) (!(de->flags[-sbi->s_high_sierra] & 5)
|| dir->i_sb->u.isofs_sb.s_unhide == 'y')) || sbi->s_unhide == 'y'))
{ {
match = (isofs_cmp(dentry,dpnt,dlen) == 0); match = (isofs_cmp(dentry,dpnt,dlen) == 0);
} }
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#define CHECK_SP(FAIL) \ #define CHECK_SP(FAIL) \
if(rr->u.SP.magic[0] != 0xbe) FAIL; \ if(rr->u.SP.magic[0] != 0xbe) FAIL; \
if(rr->u.SP.magic[1] != 0xef) FAIL; \ if(rr->u.SP.magic[1] != 0xef) FAIL; \
inode->i_sb->u.isofs_sb.s_rock_offset=rr->u.SP.skip; ISOFS_SB(inode->i_sb)->s_rock_offset=rr->u.SP.skip;
/* We define a series of macros because each function must do exactly the /* We define a series of macros because each function must do exactly the
same thing in certain places. We use the macros to ensure that everything same thing in certain places. We use the macros to ensure that everything
is done correctly */ is done correctly */
...@@ -51,10 +51,10 @@ ...@@ -51,10 +51,10 @@
if(LEN & 1) LEN++; \ if(LEN & 1) LEN++; \
CHR = ((unsigned char *) DE) + LEN; \ CHR = ((unsigned char *) DE) + LEN; \
LEN = *((unsigned char *) DE) - LEN; \ LEN = *((unsigned char *) DE) - LEN; \
if (inode->i_sb->u.isofs_sb.s_rock_offset!=-1) \ if (ISOFS_SB(inode->i_sb)->s_rock_offset!=-1) \
{ \ { \
LEN-=inode->i_sb->u.isofs_sb.s_rock_offset; \ LEN-=ISOFS_SB(inode->i_sb)->s_rock_offset; \
CHR+=inode->i_sb->u.isofs_sb.s_rock_offset; \ CHR+=ISOFS_SB(inode->i_sb)->s_rock_offset; \
if (LEN<0) LEN=0; \ if (LEN<0) LEN=0; \
} \ } \
} }
...@@ -102,7 +102,7 @@ int find_rock_ridge_relocation(struct iso_directory_record * de, ...@@ -102,7 +102,7 @@ int find_rock_ridge_relocation(struct iso_directory_record * de,
/* Return value if we do not find appropriate record. */ /* Return value if we do not find appropriate record. */
retval = isonum_733 (de->extent); retval = isonum_733 (de->extent);
if (!inode->i_sb->u.isofs_sb.s_rock) return retval; if (!ISOFS_SB(inode->i_sb)->s_rock) return retval;
SETUP_ROCK_RIDGE(de, chr, len); SETUP_ROCK_RIDGE(de, chr, len);
repeat: repeat:
...@@ -162,7 +162,7 @@ int get_rock_ridge_filename(struct iso_directory_record * de, ...@@ -162,7 +162,7 @@ int get_rock_ridge_filename(struct iso_directory_record * de,
CONTINUE_DECLS; CONTINUE_DECLS;
int retnamlen = 0, truncate=0; int retnamlen = 0, truncate=0;
if (!inode->i_sb->u.isofs_sb.s_rock) return 0; if (!ISOFS_SB(inode->i_sb)->s_rock) return 0;
*retname = 0; *retname = 0;
SETUP_ROCK_RIDGE(de, chr, len); SETUP_ROCK_RIDGE(de, chr, len);
...@@ -234,7 +234,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -234,7 +234,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
int symlink_len = 0; int symlink_len = 0;
CONTINUE_DECLS; CONTINUE_DECLS;
if (!inode->i_sb->u.isofs_sb.s_rock) return 0; if (!ISOFS_SB(inode->i_sb)->s_rock) return 0;
SETUP_ROCK_RIDGE(de, chr, len); SETUP_ROCK_RIDGE(de, chr, len);
if (regard_xa) if (regard_xa)
...@@ -272,7 +272,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -272,7 +272,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
CHECK_CE; CHECK_CE;
break; break;
case SIG('E','R'): case SIG('E','R'):
inode->i_sb->u.isofs_sb.s_rock = 1; ISOFS_SB(inode->i_sb)->s_rock = 1;
printk(KERN_DEBUG "ISO 9660 Extensions: "); printk(KERN_DEBUG "ISO 9660 Extensions: ");
{ int p; { int p;
for(p=0;p<rr->u.ER.len_id;p++) printk("%c",rr->u.ER.data[p]); for(p=0;p<rr->u.ER.len_id;p++) printk("%c",rr->u.ER.data[p]);
...@@ -368,7 +368,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -368,7 +368,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
ISOFS_I(inode)->i_first_extent = isonum_733(rr->u.CL.location); ISOFS_I(inode)->i_first_extent = isonum_733(rr->u.CL.location);
reloc = iget(inode->i_sb, reloc = iget(inode->i_sb,
(ISOFS_I(inode)->i_first_extent << (ISOFS_I(inode)->i_first_extent <<
inode -> i_sb -> u.isofs_sb.s_log_zone_size)); ISOFS_SB(inode->i_sb)->s_log_zone_size));
if (!reloc) if (!reloc)
goto out; goto out;
inode->i_mode = reloc->i_mode; inode->i_mode = reloc->i_mode;
...@@ -385,7 +385,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -385,7 +385,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
break; break;
#ifdef CONFIG_ZISOFS #ifdef CONFIG_ZISOFS
case SIG('Z','F'): case SIG('Z','F'):
if ( !inode->i_sb->u.isofs_sb.s_nocompress ) { if ( !ISOFS_SB(inode->i_sb)->s_nocompress ) {
int algo; int algo;
algo = isonum_721(rr->u.ZF.algorithm); algo = isonum_721(rr->u.ZF.algorithm);
if ( algo == SIG('p','z') ) { if ( algo == SIG('p','z') ) {
...@@ -478,8 +478,8 @@ int parse_rock_ridge_inode(struct iso_directory_record * de, ...@@ -478,8 +478,8 @@ int parse_rock_ridge_inode(struct iso_directory_record * de,
int result=parse_rock_ridge_inode_internal(de,inode,0); int result=parse_rock_ridge_inode_internal(de,inode,0);
/* if rockridge flag was reset and we didn't look for attributes /* if rockridge flag was reset and we didn't look for attributes
* behind eventual XA attributes, have a look there */ * behind eventual XA attributes, have a look there */
if ((inode->i_sb->u.isofs_sb.s_rock_offset==-1) if ((ISOFS_SB(inode->i_sb)->s_rock_offset==-1)
&&(inode->i_sb->u.isofs_sb.s_rock==2)) &&(ISOFS_SB(inode->i_sb)->s_rock==2))
{ {
result=parse_rock_ridge_inode_internal(de,inode,14); result=parse_rock_ridge_inode_internal(de,inode,14);
}; };
...@@ -506,7 +506,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) ...@@ -506,7 +506,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
unsigned char *chr; unsigned char *chr;
struct rock_ridge *rr; struct rock_ridge *rr;
if (!inode->i_sb->u.isofs_sb.s_rock) if (!ISOFS_SB(inode->i_sb)->s_rock)
panic ("Cannot have symlink with high sierra variant of iso filesystem\n"); panic ("Cannot have symlink with high sierra variant of iso filesystem\n");
block = inode->i_ino >> bufbits; block = inode->i_ino >> bufbits;
......
...@@ -25,235 +25,16 @@ ...@@ -25,235 +25,16 @@
#include <linux/locks.h> #include <linux/locks.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/devfs_fs_kernel.h> #include <linux/devfs_fs_kernel.h>
#include <linux/major.h>
#include <linux/acct.h> #include <linux/acct.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <linux/kmod.h> void get_filesystem(struct file_system_type *fs);
#define __NO_VERSION__ void put_filesystem(struct file_system_type *fs);
#include <linux/module.h> struct file_system_type *get_fs_type(const char *name);
LIST_HEAD(super_blocks); LIST_HEAD(super_blocks);
spinlock_t sb_lock = SPIN_LOCK_UNLOCKED; spinlock_t sb_lock = SPIN_LOCK_UNLOCKED;
/*
* Handling of filesystem drivers list.
* Rules:
* Inclusion to/removals from/scanning of list are protected by spinlock.
* During the unload module must call unregister_filesystem().
* We can access the fields of list element if:
* 1) spinlock is held or
* 2) we hold the reference to the module.
* The latter can be guaranteed by call of try_inc_mod_count(); if it
* returned 0 we must skip the element, otherwise we got the reference.
* Once the reference is obtained we can drop the spinlock.
*/
static struct file_system_type *file_systems;
static rwlock_t file_systems_lock = RW_LOCK_UNLOCKED;
/* WARNING: This can be used only if we _already_ own a reference */
static void get_filesystem(struct file_system_type *fs)
{
if (fs->owner)
__MOD_INC_USE_COUNT(fs->owner);
}
static void put_filesystem(struct file_system_type *fs)
{
if (fs->owner)
__MOD_DEC_USE_COUNT(fs->owner);
}
static struct file_system_type **find_filesystem(const char *name)
{
struct file_system_type **p;
for (p=&file_systems; *p; p=&(*p)->next)
if (strcmp((*p)->name,name) == 0)
break;
return p;
}
/**
* register_filesystem - register a new filesystem
* @fs: the file system structure
*
* Adds the file system passed to the list of file systems the kernel
* is aware of for mount and other syscalls. Returns 0 on success,
* or a negative errno code on an error.
*
* The &struct file_system_type that is passed is linked into the kernel
* structures and must not be freed until the file system has been
* unregistered.
*/
int register_filesystem(struct file_system_type * fs)
{
int res = 0;
struct file_system_type ** p;
if (!fs)
return -EINVAL;
if (fs->next)
return -EBUSY;
INIT_LIST_HEAD(&fs->fs_supers);
write_lock(&file_systems_lock);
p = find_filesystem(fs->name);
if (*p)
res = -EBUSY;
else
*p = fs;
write_unlock(&file_systems_lock);
return res;
}
/**
* unregister_filesystem - unregister a file system
* @fs: filesystem to unregister
*
* Remove a file system that was previously successfully registered
* with the kernel. An error is returned if the file system is not found.
* Zero is returned on a success.
*
* Once this function has returned the &struct file_system_type structure
* may be freed or reused.
*/
int unregister_filesystem(struct file_system_type * fs)
{
struct file_system_type ** tmp;
write_lock(&file_systems_lock);
tmp = &file_systems;
while (*tmp) {
if (fs == *tmp) {
*tmp = fs->next;
fs->next = NULL;
write_unlock(&file_systems_lock);
return 0;
}
tmp = &(*tmp)->next;
}
write_unlock(&file_systems_lock);
return -EINVAL;
}
static int fs_index(const char * __name)
{
struct file_system_type * tmp;
char * name;
int err, index;
name = getname(__name);
err = PTR_ERR(name);
if (IS_ERR(name))
return err;
err = -EINVAL;
read_lock(&file_systems_lock);
for (tmp=file_systems, index=0 ; tmp ; tmp=tmp->next, index++) {
if (strcmp(tmp->name,name) == 0) {
err = index;
break;
}
}
read_unlock(&file_systems_lock);
putname(name);
return err;
}
static int fs_name(unsigned int index, char * buf)
{
struct file_system_type * tmp;
int len, res;
read_lock(&file_systems_lock);
for (tmp = file_systems; tmp; tmp = tmp->next, index--)
if (index <= 0 && try_inc_mod_count(tmp->owner))
break;
read_unlock(&file_systems_lock);
if (!tmp)
return -EINVAL;
/* OK, we got the reference, so we can safely block */
len = strlen(tmp->name) + 1;
res = copy_to_user(buf, tmp->name, len) ? -EFAULT : 0;
put_filesystem(tmp);
return res;
}
static int fs_maxindex(void)
{
struct file_system_type * tmp;
int index;
read_lock(&file_systems_lock);
for (tmp = file_systems, index = 0 ; tmp ; tmp = tmp->next, index++)
;
read_unlock(&file_systems_lock);
return index;
}
/*
* Whee.. Weird sysv syscall.
*/
asmlinkage long sys_sysfs(int option, unsigned long arg1, unsigned long arg2)
{
int retval = -EINVAL;
switch (option) {
case 1:
retval = fs_index((const char *) arg1);
break;
case 2:
retval = fs_name(arg1, (char *) arg2);
break;
case 3:
retval = fs_maxindex();
break;
}
return retval;
}
int get_filesystem_list(char * buf)
{
int len = 0;
struct file_system_type * tmp;
read_lock(&file_systems_lock);
tmp = file_systems;
while (tmp && len < PAGE_SIZE - 80) {
len += sprintf(buf+len, "%s\t%s\n",
(tmp->fs_flags & FS_REQUIRES_DEV) ? "" : "nodev",
tmp->name);
tmp = tmp->next;
}
read_unlock(&file_systems_lock);
return len;
}
struct file_system_type *get_fs_type(const char *name)
{
struct file_system_type *fs;
read_lock(&file_systems_lock);
fs = *(find_filesystem(name));
if (fs && !try_inc_mod_count(fs->owner))
fs = NULL;
read_unlock(&file_systems_lock);
if (!fs && (request_module(name) == 0)) {
read_lock(&file_systems_lock);
fs = *(find_filesystem(name));
if (fs && !try_inc_mod_count(fs->owner))
fs = NULL;
read_unlock(&file_systems_lock);
}
return fs;
}
/** /**
* alloc_super - create new superblock * alloc_super - create new superblock
* *
......
...@@ -1413,12 +1413,17 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) ...@@ -1413,12 +1413,17 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
struct inode *inode=NULL; struct inode *inode=NULL;
struct udf_options uopt; struct udf_options uopt;
lb_addr rootdir, fileset; lb_addr rootdir, fileset;
struct udf_sb_info *sbi;
uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
uopt.uid = -1; uopt.uid = -1;
uopt.gid = -1; uopt.gid = -1;
uopt.umask = 0; uopt.umask = 0;
sbi = kmalloc(sizeof(struct udf_sb_info), GFP_KERNEL);
if (!sbi)
return -ENOMEM;
sb->u.generic_sbp = sbi;
memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info));
#if UDFFS_RW != 1 #if UDFFS_RW != 1
...@@ -1607,6 +1612,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) ...@@ -1607,6 +1612,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
udf_close_lvid(sb); udf_close_lvid(sb);
udf_release_data(UDF_SB_LVIDBH(sb)); udf_release_data(UDF_SB_LVIDBH(sb));
UDF_SB_FREE(sb); UDF_SB_FREE(sb);
kfree(sbi);
sb->u.generic_sbp = NULL;
return -EINVAL; return -EINVAL;
} }
...@@ -1697,6 +1704,8 @@ udf_put_super(struct super_block *sb) ...@@ -1697,6 +1704,8 @@ udf_put_super(struct super_block *sb)
udf_close_lvid(sb); udf_close_lvid(sb);
udf_release_data(UDF_SB_LVIDBH(sb)); udf_release_data(UDF_SB_LVIDBH(sb));
UDF_SB_FREE(sb); UDF_SB_FREE(sb);
kfree(sb->u.generic_sbp);
sb->u.generic_sbp = NULL;
} }
/* /*
......
...@@ -30,6 +30,11 @@ ...@@ -30,6 +30,11 @@
#define UDF_PART_FLAG_REWRITABLE 0x0040 #define UDF_PART_FLAG_REWRITABLE 0x0040
#define UDF_PART_FLAG_OVERWRITABLE 0x0080 #define UDF_PART_FLAG_OVERWRITABLE 0x0080
static inline struct udf_sb_info *UDF_SB(struct super_block *sb)
{
return sb->u.generic_sbp;
}
#define UDF_SB_FREE(X)\ #define UDF_SB_FREE(X)\
{\ {\
if (UDF_SB(X))\ if (UDF_SB(X))\
...@@ -39,7 +44,6 @@ ...@@ -39,7 +44,6 @@
UDF_SB_PARTMAPS(X) = NULL;\ UDF_SB_PARTMAPS(X) = NULL;\
}\ }\
} }
#define UDF_SB(X) (&((X)->u.udf_sb))
#define UDF_SB_ALLOC_PARTMAPS(X,Y)\ #define UDF_SB_ALLOC_PARTMAPS(X,Y)\
{\ {\
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/udf_fs_i.h>
#include <linux/udf_fs_sb.h>
#ifndef LINUX_VERSION_CODE #ifndef LINUX_VERSION_CODE
#include <linux/version.h> #include <linux/version.h>
...@@ -15,8 +17,6 @@ ...@@ -15,8 +17,6 @@
#if !defined(CONFIG_UDF_FS) && !defined(CONFIG_UDF_FS_MODULE) #if !defined(CONFIG_UDF_FS) && !defined(CONFIG_UDF_FS_MODULE)
#define CONFIG_UDF_FS_MODULE #define CONFIG_UDF_FS_MODULE
#include <linux/udf_fs_i.h>
#include <linux/udf_fs_sb.h>
#endif #endif
#include "udfend.h" #include "udfend.h"
......
...@@ -99,7 +99,6 @@ typedef struct siginfo { ...@@ -99,7 +99,6 @@ typedef struct siginfo {
/* /*
* si_code values * si_code values
* Digital reserves positive values for kernel-generated signals.
*/ */
#define SI_USER 0 /* sent by kill, sigsend, raise */ #define SI_USER 0 /* sent by kill, sigsend, raise */
#define SI_KERNEL 0x80 /* sent by the kernel from somewhere */ #define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
...@@ -109,6 +108,7 @@ typedef struct siginfo { ...@@ -109,6 +108,7 @@ typedef struct siginfo {
#define SI_ASYNCIO -4 /* sent by AIO completion */ #define SI_ASYNCIO -4 /* sent by AIO completion */
#define SI_SIGIO -5 /* sent by queued SIGIO */ #define SI_SIGIO -5 /* sent by queued SIGIO */
#define SI_TKILL -6 /* sent by tkill system call */ #define SI_TKILL -6 /* sent by tkill system call */
#define SI_DETHREAD -7 /* sent by execve() killing subsidiary threads */
#define SI_FROMUSER(siptr) ((siptr)->si_code <= 0) #define SI_FROMUSER(siptr) ((siptr)->si_code <= 0)
#define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0) #define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0)
......
...@@ -18,10 +18,11 @@ ...@@ -18,10 +18,11 @@
* If you change this, change the TI_* offsets below to match. * If you change this, change the TI_* offsets below to match.
*/ */
struct thread_info { struct thread_info {
struct task_struct *task; /* main task structure */ struct task_struct *task; /* main task structure */
struct exec_domain *exec_domain; /* execution domain */ struct exec_domain *exec_domain; /* execution domain */
unsigned long flags; /* low level flags */ unsigned long flags; /* low level flags */
int cpu; /* cpu we're on */ int cpu; /* cpu we're on */
int preempt_count; /* not used at present */
}; };
/* /*
......
...@@ -648,7 +648,6 @@ struct quota_mount_options ...@@ -648,7 +648,6 @@ struct quota_mount_options
#include <linux/ext3_fs_sb.h> #include <linux/ext3_fs_sb.h>
#include <linux/hpfs_fs_sb.h> #include <linux/hpfs_fs_sb.h>
#include <linux/ntfs_fs_sb.h> #include <linux/ntfs_fs_sb.h>
#include <linux/iso_fs_sb.h>
#include <linux/sysv_fs_sb.h> #include <linux/sysv_fs_sb.h>
#include <linux/affs_fs_sb.h> #include <linux/affs_fs_sb.h>
#include <linux/ufs_fs_sb.h> #include <linux/ufs_fs_sb.h>
...@@ -657,7 +656,6 @@ struct quota_mount_options ...@@ -657,7 +656,6 @@ struct quota_mount_options
#include <linux/adfs_fs_sb.h> #include <linux/adfs_fs_sb.h>
#include <linux/reiserfs_fs_sb.h> #include <linux/reiserfs_fs_sb.h>
#include <linux/bfs_fs_sb.h> #include <linux/bfs_fs_sb.h>
#include <linux/udf_fs_sb.h>
extern struct list_head super_blocks; extern struct list_head super_blocks;
extern spinlock_t sb_lock; extern spinlock_t sb_lock;
...@@ -696,7 +694,6 @@ struct super_block { ...@@ -696,7 +694,6 @@ struct super_block {
struct ext3_sb_info ext3_sb; struct ext3_sb_info ext3_sb;
struct hpfs_sb_info hpfs_sb; struct hpfs_sb_info hpfs_sb;
struct ntfs_sb_info ntfs_sb; struct ntfs_sb_info ntfs_sb;
struct isofs_sb_info isofs_sb;
struct sysv_sb_info sysv_sb; struct sysv_sb_info sysv_sb;
struct affs_sb_info affs_sb; struct affs_sb_info affs_sb;
struct ufs_sb_info ufs_sb; struct ufs_sb_info ufs_sb;
...@@ -706,7 +703,6 @@ struct super_block { ...@@ -706,7 +703,6 @@ struct super_block {
struct adfs_sb_info adfs_sb; struct adfs_sb_info adfs_sb;
struct reiserfs_sb_info reiserfs_sb; struct reiserfs_sb_info reiserfs_sb;
struct bfs_sb_info bfs_sb; struct bfs_sb_info bfs_sb;
struct udf_sb_info udf_sb;
void *generic_sbp; void *generic_sbp;
} u; } u;
/* /*
......
...@@ -119,6 +119,7 @@ struct hiddev_usage_ref { ...@@ -119,6 +119,7 @@ struct hiddev_usage_ref {
__s32 value; __s32 value;
}; };
#define HID_FIELD_INDEX_NONE 0xffffffff
/* /*
* Protocol version. * Protocol version.
...@@ -143,6 +144,15 @@ struct hiddev_usage_ref { ...@@ -143,6 +144,15 @@ struct hiddev_usage_ref {
#define HIDIOCGUSAGE _IOWR('H', 0x0B, struct hiddev_usage_ref) #define HIDIOCGUSAGE _IOWR('H', 0x0B, struct hiddev_usage_ref)
#define HIDIOCSUSAGE _IOW('H', 0x0C, struct hiddev_usage_ref) #define HIDIOCSUSAGE _IOW('H', 0x0C, struct hiddev_usage_ref)
#define HIDIOCGUCODE _IOWR('H', 0x0D, struct hiddev_usage_ref) #define HIDIOCGUCODE _IOWR('H', 0x0D, struct hiddev_usage_ref)
#define HIDIOCGFLAG _IOR('H', 0x0E, int)
#define HIDIOCSFLAG _IOW('H', 0x0F, int)
/*
* Flags to be used in HIDIOCSFLAG
*/
#define HIDDEV_FLAG_UREF 0x1
#define HIDDEV_FLAG_REPORT 0x2
#define HIDDEV_FLAGS 0x3
/* To traverse the input report descriptor info for a HID device, perform the /* To traverse the input report descriptor info for a HID device, perform the
* following: * following:
...@@ -179,7 +189,7 @@ struct hiddev_usage_ref { ...@@ -179,7 +189,7 @@ struct hiddev_usage_ref {
#ifdef CONFIG_USB_HIDDEV #ifdef CONFIG_USB_HIDDEV
int hiddev_connect(struct hid_device *); int hiddev_connect(struct hid_device *);
void hiddev_disconnect(struct hid_device *); void hiddev_disconnect(struct hid_device *);
void hiddev_hid_event(struct hid_device *, unsigned int usage, int value); void hiddev_hid_event(struct hid_device *, struct hiddev_usage_ref *ref);
int __init hiddev_init(void); int __init hiddev_init(void);
void __exit hiddev_exit(void); void __exit hiddev_exit(void);
#else #else
......
...@@ -122,6 +122,7 @@ struct wanpipe_opt ...@@ -122,6 +122,7 @@ struct wanpipe_opt
unsigned poll_cnt; unsigned poll_cnt;
unsigned char force; /* Used to force sock release */ unsigned char force; /* Used to force sock release */
atomic_t packet_sent; atomic_t packet_sent;
unsigned short num;
}; };
#define wp_sk(__sk) ((struct wanpipe_opt *)(__sk)->protinfo) #define wp_sk(__sk) ((struct wanpipe_opt *)(__sk)->protinfo)
......
...@@ -160,7 +160,6 @@ struct iso_directory_record { ...@@ -160,7 +160,6 @@ struct iso_directory_record {
#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize) #define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize)
#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits) #define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits)
#define ISOFS_ZONE_BITS(INODE) ((INODE)->i_sb->u.isofs_sb.s_log_zone_size)
#define ISOFS_SUPER_MAGIC 0x9660 #define ISOFS_SUPER_MAGIC 0x9660
...@@ -171,6 +170,12 @@ struct iso_directory_record { ...@@ -171,6 +170,12 @@ struct iso_directory_record {
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/iso_fs_i.h> #include <linux/iso_fs_i.h>
#include <linux/iso_fs_sb.h>
static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
{
return sb->u.generic_sbp;
}
static inline struct iso_inode_info *ISOFS_I(struct inode *inode) static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
{ {
......
...@@ -38,7 +38,7 @@ MODULE_LICENSE("GPL"); ...@@ -38,7 +38,7 @@ MODULE_LICENSE("GPL");
static int kill_proto(const struct ip_conntrack *i, void *data) static int kill_proto(const struct ip_conntrack *i, void *data)
{ {
return (i->tuplehash[IP_CT_DIR_ORIGINAL].dst.protonum == return (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum ==
*((u_int8_t *) data)); *((u_int8_t *) data));
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
* Alan Cox. * Alan Cox.
* X25 socket Author: Jonathan Naylor. * X25 socket Author: Jonathan Naylor.
* ============================================================================ * ============================================================================
* Mar 15, 2002 Arnaldo C. Melo o Use wp_sk()->num, as it isnt anymore in sock
* Apr 25, 2000 Nenad Corbic o Added the ability to send zero length packets. * Apr 25, 2000 Nenad Corbic o Added the ability to send zero length packets.
* Mar 13, 2000 Nenad Corbic o Added a tx buffer check via ioctl call. * Mar 13, 2000 Nenad Corbic o Added a tx buffer check via ioctl call.
* Mar 06, 2000 Nenad Corbic o Fixed the corrupt sock lcn problem. * Mar 06, 2000 Nenad Corbic o Fixed the corrupt sock lcn problem.
...@@ -164,11 +165,11 @@ static void dbg_kfree(void * v, int line) { ...@@ -164,11 +165,11 @@ static void dbg_kfree(void * v, int line) {
/* List of all wanpipe sockets. */ /* List of all wanpipe sockets. */
struct sock * wanpipe_sklist = NULL; struct sock* wanpipe_sklist;
static rwlock_t wanpipe_sklist_lock = RW_LOCK_UNLOCKED; static rwlock_t wanpipe_sklist_lock = RW_LOCK_UNLOCKED;
atomic_t wanpipe_socks_nr; atomic_t wanpipe_socks_nr;
static unsigned long wanpipe_tx_critical=0; static unsigned long wanpipe_tx_critical;
#if 0 #if 0
/* Private wanpipe socket structures. */ /* Private wanpipe socket structures. */
...@@ -187,9 +188,9 @@ struct wanpipe_opt ...@@ -187,9 +188,9 @@ struct wanpipe_opt
}; };
#endif #endif
static int sk_count=0; static int sk_count;
extern struct proto_ops wanpipe_ops; extern struct proto_ops wanpipe_ops;
static unsigned long find_free_critical=0; static unsigned long find_free_critical;
static void wanpipe_unlink_driver (struct sock *); static void wanpipe_unlink_driver (struct sock *);
static void wanpipe_link_driver (netdevice_t *,struct sock *sk); static void wanpipe_link_driver (netdevice_t *,struct sock *sk);
...@@ -400,9 +401,9 @@ static int wanpipe_listen_rcv (struct sk_buff *skb, struct sock *sk) ...@@ -400,9 +401,9 @@ static int wanpipe_listen_rcv (struct sk_buff *skb, struct sock *sk)
card->u.x.svc_to_dev_map[(chan->lcn%MAX_X25_LCN)] = dev; card->u.x.svc_to_dev_map[(chan->lcn%MAX_X25_LCN)] = dev;
newsk->zapped=0; newsk->zapped=0;
newsk->num = htons(X25_PROT); newwp->num = htons(X25_PROT);
if (wanpipe_do_bind(newsk,dev,newsk->num)){ if (wanpipe_do_bind(newsk, dev, newwp->num)) {
wanpipe_kill_sock_irq (newsk); wanpipe_kill_sock_irq (newsk);
release_device(dev); release_device(dev);
return -EINVAL; return -EINVAL;
...@@ -470,7 +471,7 @@ static struct sock *wanpipe_make_new(struct sock *osk) ...@@ -470,7 +471,7 @@ static struct sock *wanpipe_make_new(struct sock *osk)
sk->socket = osk->socket; sk->socket = osk->socket;
sk->priority = osk->priority; sk->priority = osk->priority;
sk->protocol = osk->protocol; sk->protocol = osk->protocol;
sk->num = osk->num; wp_sk(sk)->num = wp_sk(osk)->num;
sk->rcvbuf = osk->rcvbuf; sk->rcvbuf = osk->rcvbuf;
sk->sndbuf = osk->sndbuf; sk->sndbuf = osk->sndbuf;
sk->debug = osk->debug; sk->debug = osk->debug;
...@@ -566,9 +567,11 @@ static int wanpipe_sendmsg(struct socket *sock, struct msghdr *msg, int len, ...@@ -566,9 +567,11 @@ static int wanpipe_sendmsg(struct socket *sock, struct msghdr *msg, int len,
if (len < sizeof(x25api_hdr_t)) if (len < sizeof(x25api_hdr_t))
return -EINVAL; return -EINVAL;
wp = wp_sk(sk);
if (saddr == NULL) { if (saddr == NULL) {
ifindex = sk->bound_dev_if; ifindex = sk->bound_dev_if;
proto = sk->num; proto = wp->num;
addr = NULL; addr = NULL;
}else{ }else{
...@@ -648,7 +651,6 @@ static int wanpipe_sendmsg(struct socket *sock, struct msghdr *msg, int len, ...@@ -648,7 +651,6 @@ static int wanpipe_sendmsg(struct socket *sock, struct msghdr *msg, int len,
} }
skb_queue_tail(&sk->write_queue,skb); skb_queue_tail(&sk->write_queue,skb);
wp = wp_sk(sk);
atomic_inc(&wp->packet_sent); atomic_inc(&wp->packet_sent);
if (!(test_and_set_bit(0, &wp->timer))){ if (!(test_and_set_bit(0, &wp->timer))){
...@@ -998,7 +1000,8 @@ static int wanpipe_release(struct socket *sock, struct socket *peersock) ...@@ -998,7 +1000,8 @@ static int wanpipe_release(struct socket *sock, struct socket *peersock)
* Unhook packet receive handler. * Unhook packet receive handler.
*/ */
if (sk->num == htons(X25_PROT) && sk->state != WANSOCK_DISCONNECTED && sk->zapped){ if (wp->num == htons(X25_PROT) &&
sk->state != WANSOCK_DISCONNECTED && sk->zapped) {
netdevice_t *dev = dev_get_by_index(sk->bound_dev_if); netdevice_t *dev = dev_get_by_index(sk->bound_dev_if);
wanpipe_common_t *chan; wanpipe_common_t *chan;
if (dev){ if (dev){
...@@ -1206,7 +1209,8 @@ static void wanpipe_kill_sock_timer (unsigned long data) ...@@ -1206,7 +1209,8 @@ static void wanpipe_kill_sock_timer (unsigned long data)
write_unlock(&wanpipe_sklist_lock); write_unlock(&wanpipe_sklist_lock);
if (sk->num == htons(X25_PROT) && sk->state != WANSOCK_DISCONNECTED){ if (wp_sk(sk)->num == htons(X25_PROT) &&
sk->state != WANSOCK_DISCONNECTED){
netdevice_t *dev = dev_get_by_index(sk->bound_dev_if); netdevice_t *dev = dev_get_by_index(sk->bound_dev_if);
wanpipe_common_t *chan; wanpipe_common_t *chan;
if (dev){ if (dev){
...@@ -1352,6 +1356,7 @@ static void wanpipe_kill_sock_irq (struct sock *sk) ...@@ -1352,6 +1356,7 @@ static void wanpipe_kill_sock_irq (struct sock *sk)
static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol) static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol)
{ {
wanpipe_opt *wp = wp_sk(sk);
wanpipe_common_t *chan=NULL; wanpipe_common_t *chan=NULL;
int err=0; int err=0;
...@@ -1360,7 +1365,7 @@ static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol) ...@@ -1360,7 +1365,7 @@ static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol)
goto bind_unlock_exit; goto bind_unlock_exit;
} }
sk->num = protocol; wp->num = protocol;
if (protocol == 0){ if (protocol == 0){
release_device(dev); release_device(dev);
...@@ -1373,7 +1378,7 @@ static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol) ...@@ -1373,7 +1378,7 @@ static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol)
chan=dev->priv; chan=dev->priv;
sk->state = chan->state; sk->state = chan->state;
if (sk->num == htons(X25_PROT) && if (wp->num == htons(X25_PROT) &&
sk->state != WANSOCK_DISCONNECTED && sk->state != WANSOCK_DISCONNECTED &&
sk->state != WANSOCK_CONNECTING){ sk->state != WANSOCK_CONNECTING){
DBG_PRINTK(KERN_INFO DBG_PRINTK(KERN_INFO
...@@ -1388,7 +1393,7 @@ static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol) ...@@ -1388,7 +1393,7 @@ static int wanpipe_do_bind(struct sock *sk, netdevice_t *dev, int protocol)
sk->bound_dev_if = dev->ifindex; sk->bound_dev_if = dev->ifindex;
/* X25 Specific option */ /* X25 Specific option */
if (sk->num == htons(X25_PROT)) if (wp->num == htons(X25_PROT))
wp_sk(sk)->svc = chan->svc; wp_sk(sk)->svc = chan->svc;
} else { } else {
...@@ -1421,6 +1426,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le ...@@ -1421,6 +1426,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
{ {
struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)uaddr; struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)uaddr;
struct sock *sk=sock->sk; struct sock *sk=sock->sk;
wanpipe_opt *wp = wp_sk(sk);
netdevice_t *dev = NULL; netdevice_t *dev = NULL;
sdla_t *card=NULL; sdla_t *card=NULL;
char name[15]; char name[15];
...@@ -1462,7 +1468,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le ...@@ -1462,7 +1468,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
return err; return err;
if (sll->sll_protocol) if (sll->sll_protocol)
sk->num = sll->sll_protocol; wp->num = sll->sll_protocol;
sk->state = WANSOCK_BIND_LISTEN; sk->state = WANSOCK_BIND_LISTEN;
return 0; return 0;
...@@ -1509,7 +1515,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le ...@@ -1509,7 +1515,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
return -EINVAL; return -EINVAL;
} }
return wanpipe_do_bind(sk, dev, sll->sll_protocol ? : sk->num); return wanpipe_do_bind(sk, dev, sll->sll_protocol ? : wp->num);
} }
/*============================================================ /*============================================================
...@@ -1613,7 +1619,7 @@ static int wanpipe_create(struct socket *sock, int protocol) ...@@ -1613,7 +1619,7 @@ static int wanpipe_create(struct socket *sock, int protocol)
sk->zapped=0; sk->zapped=0;
sk->family = PF_WANPIPE; sk->family = PF_WANPIPE;
sk->num = protocol; wp_sk(sk)->num = protocol;
sk->state = WANSOCK_DISCONNECTED; sk->state = WANSOCK_DISCONNECTED;
sk->ack_backlog = 0; sk->ack_backlog = 0;
sk->bound_dev_if=0; sk->bound_dev_if=0;
...@@ -1774,7 +1780,7 @@ static int wanpipe_getname(struct socket *sock, struct sockaddr *uaddr, ...@@ -1774,7 +1780,7 @@ static int wanpipe_getname(struct socket *sock, struct sockaddr *uaddr,
sll->sll_family = AF_WANPIPE; sll->sll_family = AF_WANPIPE;
sll->sll_ifindex = sk->bound_dev_if; sll->sll_ifindex = sk->bound_dev_if;
sll->sll_protocol = sk->num; sll->sll_protocol = wp_sk(sk)->num;
dev = dev_get_by_index(sk->bound_dev_if); dev = dev_get_by_index(sk->bound_dev_if);
if (dev) { if (dev) {
sll->sll_hatype = dev->type; sll->sll_hatype = dev->type;
...@@ -1836,7 +1842,8 @@ static int wanpipe_notifier(struct notifier_block *this, unsigned long msg, void ...@@ -1836,7 +1842,8 @@ static int wanpipe_notifier(struct notifier_block *this, unsigned long msg, void
} }
break; break;
case NETDEV_UP: case NETDEV_UP:
if (dev->ifindex == sk->bound_dev_if && sk->num && !sk->zapped) { if (dev->ifindex == sk->bound_dev_if &&
po->num && !sk->zapped) {
printk(KERN_INFO "wansock: Registering Device: %s\n", printk(KERN_INFO "wansock: Registering Device: %s\n",
dev->name); dev->name);
wanpipe_link_driver(dev,sk); wanpipe_link_driver(dev,sk);
...@@ -2242,7 +2249,7 @@ unsigned int wanpipe_poll(struct file * file, struct socket *sock, poll_table *w ...@@ -2242,7 +2249,7 @@ unsigned int wanpipe_poll(struct file * file, struct socket *sock, poll_table *w
* where multiple packets can be pending in the socket * where multiple packets can be pending in the socket
* transmit queue */ * transmit queue */
if (sk->num == htons(X25_PROT)){ if (wp_sk(sk)->num == htons(X25_PROT)) {
if (atomic_read(&wp_sk(sk)->packet_sent)) if (atomic_read(&wp_sk(sk)->packet_sent))
return mask; return mask;
} }
...@@ -2274,7 +2281,7 @@ static int wanpipe_listen(struct socket *sock, int backlog) ...@@ -2274,7 +2281,7 @@ static int wanpipe_listen(struct socket *sock, int backlog)
/* This is x25 specific area if protocol doesn't /* This is x25 specific area if protocol doesn't
* match, return error */ * match, return error */
if (sk->num != htons(X25_PROT)) if (wp_sk(sk)->num != htons(X25_PROT))
return -EINVAL; return -EINVAL;
if (sk->state == WANSOCK_BIND_LISTEN) { if (sk->state == WANSOCK_BIND_LISTEN) {
...@@ -2352,7 +2359,7 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags) ...@@ -2352,7 +2359,7 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
/* This is x25 specific area if protocol doesn't /* This is x25 specific area if protocol doesn't
* match, return error */ * match, return error */
if (sk->num != htons(X25_PROT)) if (wp->num != htons(X25_PROT))
return -EINVAL; return -EINVAL;
...@@ -2535,7 +2542,7 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags ...@@ -2535,7 +2542,7 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags
if (sk->state != WANSOCK_LISTEN) if (sk->state != WANSOCK_LISTEN)
return -EINVAL; return -EINVAL;
if (sk->num != htons(X25_PROT)) if (wp_sk(sk)->num != htons(X25_PROT))
return -EINVAL; return -EINVAL;
add_wait_queue(sk->sleep,&wait); add_wait_queue(sk->sleep,&wait);
...@@ -2628,7 +2635,7 @@ static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr ...@@ -2628,7 +2635,7 @@ static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr
netdevice_t *dev; netdevice_t *dev;
int err; int err;
if (sk->num != htons(X25_PROT)) if (wp_sk(sk)->num != htons(X25_PROT))
return -EINVAL; return -EINVAL;
if (sk->state == WANSOCK_CONNECTED) if (sk->state == WANSOCK_CONNECTED)
......
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