Changes in 4.9.298 Bluetooth: bfusb: fix division by zero in send path USB: core: Fix bug in resuming hub's handling of wakeup requests USB: Fix "slab-out-of-bounds Write" bug in usb_hcd_poll_rh_status mfd: intel-lpss: Fix too early PM enablement in the ACPI ->probe() can: gs_usb: fix use of uninitialized variable, detach device on reception of invalid USB data can: gs_usb: gs_can_start_xmit(): zero-initialize hf->{flags,reserved} random: fix data race on crng_node_pool random: fix data race on crng init time staging: wlan-ng: Avoid bitwise vs logical OR warning in hfa384x_usb_throttlefn() drm/i915: Avoid bitwise vs logical OR warning in snb_wm_latency_quirk() media: uvcvideo: fix division by zero at stream start rtlwifi: rtl8192cu: Fix WARNING when calling local_irq_restore() with interrupts enabled HID: uhid: Fix worker destroying device without any protection HID: wacom: Avoid using stale array indicies to read contact count nfc: llcp: fix NULL error pointer dereference on sendmsg() after failed bind() rtc: cmos: take rtc_lock while reading from CMOS media: flexcop-usb: fix control-message timeouts media: mceusb: fix control-message timeouts media: em28xx: fix control-message timeouts media: cpia2: fix control-message timeouts media: s2255: fix control-message timeouts media: dib0700: fix undefined behavior in tuner shutdown media: redrat3: fix control-message timeouts media: pvrusb2: fix control-message timeouts media: stk1160: fix control-message timeouts can: softing_cs: softingcs_probe(): fix memleak on registration failure PCI: Add function 1 DMA alias quirk for Marvell 88SE9125 SATA controller shmem: fix a race between shmem_unused_huge_shrink and shmem_evict_inode Bluetooth: cmtp: fix possible panic when cmtp_init_sockets() fails wcn36xx: Indicate beacon not connection loss on MISSED_BEACON_IND Bluetooth: stop proccessing malicious adv data media: dmxdev: fix UAF when dvb_register_device() fails crypto: qce - fix uaf on qce_ahash_register_one tty: serial: atmel: Check return code of dmaengine_submit() tty: serial: atmel: Call dma_async_issue_pending() netfilter: bridge: add support for pppoe filtering arm64: dts: qcom: msm8916: fix MMC controller aliases drm/amdgpu: Fix a NULL pointer dereference in amdgpu_connector_lcd_native_mode() drm/radeon/radeon_kms: Fix a NULL pointer dereference in radeon_driver_open_kms() serial: amba-pl011: do not request memory region twice floppy: Fix hang in watchdog when disk is ejected media: dib8000: Fix a memleak in dib8000_init() media: saa7146: mxb: Fix a NULL pointer dereference in mxb_attach() media: si2157: Fix "warm" tuner state detection media: msi001: fix possible null-ptr-deref in msi001_probe() usb: ftdi-elan: fix memory leak on device disconnect pcmcia: rsrc_nonstatic: Fix a NULL pointer dereference in __nonstatic_find_io_region() pcmcia: rsrc_nonstatic: Fix a NULL pointer dereference in nonstatic_find_mem_region() ppp: ensure minimum packet size in ppp_write() fsl/fman: Check for null pointer after calling devm_ioremap spi: spi-meson-spifc: Add missing pm_runtime_disable() in meson_spifc_probe can: softing: softing_startstop(): fix set but not used variable warning can: xilinx_can: xcan_probe(): check for error irq pcmcia: fix setting of kthread task states net: mcs7830: handle usb read errors properly ext4: avoid trim error on fs with small groups ALSA: jack: Add missing rwsem around snd_ctl_remove() calls ALSA: PCM: Add missing rwsem around snd_ctl_remove() calls ALSA: hda: Add missing rwsem around snd_ctl_remove() calls RDMA/hns: Validate the pkey index powerpc/prom_init: Fix improper check of prom_getprop() ALSA: oss: fix compile error when OSS_DEBUG is enabled char/mwave: Adjust io port register size scsi: ufs: Fix race conditions related to driver data RDMA/core: Let ib_find_gid() continue search even after empty entry dmaengine: pxa/mmp: stop referencing config->slave_id ASoC: samsung: idma: Check of ioremap return value misc: lattice-ecp3-config: Fix task hung when firmware load failed mips: lantiq: add support for clk_set_parent() mips: bcm63xx: add support for clk_set_parent() RDMA/cxgb4: Set queue pair state when being queried Bluetooth: Fix debugfs entry leak in hci_register_dev() fs: dlm: filter user dlm messages for kernel locks ar5523: Fix null-ptr-deref with unexpected WDCMSG_TARGET_START reply usb: gadget: f_fs: Use stream_open() for endpoint files HID: apple: Do not reset quirks when the Fn key is not found media: b2c2: Add missing check in flexcop_pci_isr: gpiolib: acpi: Do not set the IRQ type if the IRQ is already in use HSI: core: Fix return freed object in hsi_new_client mwifiex: Fix skb_over_panic in mwifiex_usb_recv() floppy: Add max size check for user space request media: saa7146: hexium_orion: Fix a NULL pointer dereference in hexium_attach() media: m920x: don't use stack on USB reads iwlwifi: mvm: synchronize with FW after multicast commands ath10k: Fix tx hanging net: bonding: debug: avoid printing debug logs when bond is not notifying peers media: igorplugusb: receiver overflow should be reported media: saa7146: hexium_gemini: Fix a NULL pointer dereference in hexium_attach() usb: hub: Add delay for SuperSpeed hub resume to let links transit to U0 ath9k: Fix out-of-bound memcpy in ath9k_hif_usb_rx_stream um: registers: Rename function names to avoid conflicts and build problems jffs2: GC deadlock reading a page that is used in jffs2_write_begin() ACPICA: Utilities: Avoid deleting the same object twice in a row ACPICA: Executer: Fix the REFCLASS_REFOF case in acpi_ex_opcode_1A_0T_1R() btrfs: remove BUG_ON() in find_parent_nodes() btrfs: remove BUG_ON(!eie) in find_parent_nodes net: mdio: Demote probed message to debug print dm btree: add a defensive bounds check to insert_at() dm space map common: add bounds check to sm_ll_lookup_bitmap() serial: pl010: Drop CR register reset on set_termios serial: core: Keep mctrl register state and cached copy in sync parisc: Avoid calling faulthandler_disabled() twice powerpc/6xx: add missing of_node_put powerpc/powernv: add missing of_node_put powerpc/cell: add missing of_node_put powerpc/btext: add missing of_node_put i2c: i801: Don't silently correct invalid transfer size powerpc/smp: Move setup_profiling_timer() under CONFIG_PROFILING i2c: mpc: Correct I2C reset procedure w1: Misuse of get_user()/put_user() reported by sparse ALSA: seq: Set upper limit of processed events i2c: designware-pci: Fix to change data types of hcnt and lcnt parameters MIPS: Octeon: Fix build errors using clang scsi: sr: Don't use GFP_DMA ASoC: mediatek: mt8173: fix device_node leak power: bq25890: Enable continuous conversion for ADC at charging ubifs: Error path in ubifs_remount_rw() seems to wrongly free write buffers iwlwifi: mvm: Increase the scan timeout guard to 30 seconds ext4: set csum seed in tmp inode while migrating to extents ext4: Fix BUG_ON in ext4_bread when write quota data ext4: don't use the orphan list when migrating an inode fuse: fix bad inode fuse: fix live lock in fuse_iget() drm/radeon: fix error handling in radeon_driver_open_kms RDMA/hns: Modify the mapping attribute of doorbell to device RDMA/rxe: Fix a typo in opcode name powerpc/fsl/dts: Enable WA for erratum A-009885 on fman3l MDIO buses net/fsl: xgmac_mdio: Fix incorrect iounmap when removing module parisc: pdc_stable: Fix memory leak in pdcs_register_pathentries af_unix: annote lockless accesses to unix_tot_inflight & gc_in_progress net: axienet: Wait for PhyRstCmplt after core reset net: axienet: fix number of TX ring slots for available check netns: add schedule point in ops_exit_list() libcxgb: Don't accidentally set RTO_ONLINK in cxgb_find_route() dmaengine: at_xdmac: Don't start transactions at tx_submit level dmaengine: at_xdmac: Print debug message after realeasing the lock dmaengine: at_xdmac: Fix lld view setting dmaengine: at_xdmac: Fix at_xdmac_lld struct definition net_sched: restore "mpu xxx" handling bcmgenet: add WOL IRQ check scripts/dtc: dtx_diff: remove broken example from help text lib82596: Fix IRQ check in sni_82596_probe Revert "gup: document and work around "COW can break either way" issue" gup: document and work around "COW can break either way" issue drm/ttm/nouveau: don't call tt destroy callback on alloc failure. gianfar: simplify FCS handling and fix memory leak gianfar: fix jumbo packets+napi+rx overrun crash cipso,calipso: resolve a number of problems with the DOI refcounts rbtree: cache leftmost node internally lib/timerqueue: Rely on rbtree semantics for next timer mm: add follow_pte_pmd() KVM: do not assume PTE is writable after follow_pfn KVM: Use kvm_pfn_t for local PFN variable in hva_to_pfn_remapped() KVM: do not allow mapping valid but non-reference-counted pages Linux 4.9.298 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ifcea82a702a0906d9090c89785363c2d5423f652
186 lines
4.6 KiB
C
186 lines
4.6 KiB
C
/*
|
|
* sni_82596.c -- driver for intel 82596 ethernet controller, as
|
|
* used in older SNI RM machines
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/ioport.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/types.h>
|
|
#include <linux/bitops.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/io.h>
|
|
#include <linux/irq.h>
|
|
|
|
#define SNI_82596_DRIVER_VERSION "SNI RM 82596 driver - Revision: 0.01"
|
|
|
|
static const char sni_82596_string[] = "snirm_82596";
|
|
|
|
#define DMA_ALLOC dma_alloc_coherent
|
|
#define DMA_FREE dma_free_coherent
|
|
#define DMA_WBACK(priv, addr, len) do { } while (0)
|
|
#define DMA_INV(priv, addr, len) do { } while (0)
|
|
#define DMA_WBACK_INV(priv, addr, len) do { } while (0)
|
|
|
|
#define SYSBUS 0x00004400
|
|
|
|
/* big endian CPU, 82596 little endian */
|
|
#define SWAP32(x) cpu_to_le32((u32)(x))
|
|
#define SWAP16(x) cpu_to_le16((u16)(x))
|
|
|
|
#define OPT_MPU_16BIT 0x01
|
|
|
|
#include "lib82596.c"
|
|
|
|
MODULE_AUTHOR("Thomas Bogendoerfer");
|
|
MODULE_DESCRIPTION("i82596 driver");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_ALIAS("platform:snirm_82596");
|
|
module_param(i596_debug, int, 0);
|
|
MODULE_PARM_DESC(i596_debug, "82596 debug mask");
|
|
|
|
static inline void ca(struct net_device *dev)
|
|
{
|
|
struct i596_private *lp = netdev_priv(dev);
|
|
|
|
writel(0, lp->ca);
|
|
}
|
|
|
|
|
|
static void mpu_port(struct net_device *dev, int c, dma_addr_t x)
|
|
{
|
|
struct i596_private *lp = netdev_priv(dev);
|
|
|
|
u32 v = (u32) (c) | (u32) (x);
|
|
|
|
if (lp->options & OPT_MPU_16BIT) {
|
|
writew(v & 0xffff, lp->mpu_port);
|
|
wmb(); /* order writes to MPU port */
|
|
udelay(1);
|
|
writew(v >> 16, lp->mpu_port);
|
|
} else {
|
|
writel(v, lp->mpu_port);
|
|
wmb(); /* order writes to MPU port */
|
|
udelay(1);
|
|
writel(v, lp->mpu_port);
|
|
}
|
|
}
|
|
|
|
|
|
static int sni_82596_probe(struct platform_device *dev)
|
|
{
|
|
struct net_device *netdevice;
|
|
struct i596_private *lp;
|
|
struct resource *res, *ca, *idprom, *options;
|
|
int retval = -ENOMEM;
|
|
void __iomem *mpu_addr;
|
|
void __iomem *ca_addr;
|
|
u8 __iomem *eth_addr;
|
|
|
|
res = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
|
ca = platform_get_resource(dev, IORESOURCE_MEM, 1);
|
|
options = platform_get_resource(dev, 0, 0);
|
|
idprom = platform_get_resource(dev, IORESOURCE_MEM, 2);
|
|
if (!res || !ca || !options || !idprom)
|
|
return -ENODEV;
|
|
mpu_addr = ioremap_nocache(res->start, 4);
|
|
if (!mpu_addr)
|
|
return -ENOMEM;
|
|
ca_addr = ioremap_nocache(ca->start, 4);
|
|
if (!ca_addr)
|
|
goto probe_failed_free_mpu;
|
|
|
|
printk(KERN_INFO "Found i82596 at 0x%x\n", res->start);
|
|
|
|
netdevice = alloc_etherdev(sizeof(struct i596_private));
|
|
if (!netdevice)
|
|
goto probe_failed_free_ca;
|
|
|
|
SET_NETDEV_DEV(netdevice, &dev->dev);
|
|
platform_set_drvdata (dev, netdevice);
|
|
|
|
netdevice->base_addr = res->start;
|
|
netdevice->irq = platform_get_irq(dev, 0);
|
|
|
|
eth_addr = ioremap_nocache(idprom->start, 0x10);
|
|
if (!eth_addr)
|
|
goto probe_failed;
|
|
|
|
/* someone seems to like messed up stuff */
|
|
netdevice->dev_addr[0] = readb(eth_addr + 0x0b);
|
|
netdevice->dev_addr[1] = readb(eth_addr + 0x0a);
|
|
netdevice->dev_addr[2] = readb(eth_addr + 0x09);
|
|
netdevice->dev_addr[3] = readb(eth_addr + 0x08);
|
|
netdevice->dev_addr[4] = readb(eth_addr + 0x07);
|
|
netdevice->dev_addr[5] = readb(eth_addr + 0x06);
|
|
iounmap(eth_addr);
|
|
|
|
if (netdevice->irq < 0) {
|
|
printk(KERN_ERR "%s: IRQ not found for i82596 at 0x%lx\n",
|
|
__FILE__, netdevice->base_addr);
|
|
retval = netdevice->irq;
|
|
goto probe_failed;
|
|
}
|
|
|
|
lp = netdev_priv(netdevice);
|
|
lp->options = options->flags & IORESOURCE_BITS;
|
|
lp->ca = ca_addr;
|
|
lp->mpu_port = mpu_addr;
|
|
|
|
retval = i82596_probe(netdevice);
|
|
if (retval == 0)
|
|
return 0;
|
|
|
|
probe_failed:
|
|
free_netdev(netdevice);
|
|
probe_failed_free_ca:
|
|
iounmap(ca_addr);
|
|
probe_failed_free_mpu:
|
|
iounmap(mpu_addr);
|
|
return retval;
|
|
}
|
|
|
|
static int sni_82596_driver_remove(struct platform_device *pdev)
|
|
{
|
|
struct net_device *dev = platform_get_drvdata(pdev);
|
|
struct i596_private *lp = netdev_priv(dev);
|
|
|
|
unregister_netdev(dev);
|
|
DMA_FREE(dev->dev.parent, sizeof(struct i596_private),
|
|
lp->dma, lp->dma_addr);
|
|
iounmap(lp->ca);
|
|
iounmap(lp->mpu_port);
|
|
free_netdev (dev);
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver sni_82596_driver = {
|
|
.probe = sni_82596_probe,
|
|
.remove = sni_82596_driver_remove,
|
|
.driver = {
|
|
.name = sni_82596_string,
|
|
},
|
|
};
|
|
|
|
static int sni_82596_init(void)
|
|
{
|
|
printk(KERN_INFO SNI_82596_DRIVER_VERSION "\n");
|
|
return platform_driver_register(&sni_82596_driver);
|
|
}
|
|
|
|
|
|
static void __exit sni_82596_exit(void)
|
|
{
|
|
platform_driver_unregister(&sni_82596_driver);
|
|
}
|
|
|
|
module_init(sni_82596_init);
|
|
module_exit(sni_82596_exit);
|