aboutsummaryrefslogtreecommitdiffstats
diff options
-rw-r--r--qlcnic_sysfs.patch153
-rw-r--r--serial-8250_pci-add-support-for-fintek-4-8-and-12-port-cards.patch199
-rw-r--r--series4
3 files changed, 356 insertions, 0 deletions
diff --git a/qlcnic_sysfs.patch b/qlcnic_sysfs.patch
new file mode 100644
index 00000000000000..ca3871ede5552e
--- /dev/null
+++ b/qlcnic_sysfs.patch
@@ -0,0 +1,153 @@
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
+index 10ed82b3..6cc8f15f 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
+@@ -33,9 +33,9 @@ int qlcnicvf_config_led(struct qlcnic_adapter *adapter, u32 state, u32 rate)
+ return -EOPNOTSUPP;
+ }
+
+-static ssize_t qlcnic_store_bridged_mode(struct device *dev,
+- struct device_attribute *attr,
+- const char *buf, size_t len)
++static ssize_t bridged_mode_store(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t len)
+ {
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ unsigned long new;
+@@ -57,9 +57,8 @@ err_out:
+ return ret;
+ }
+
+-static ssize_t qlcnic_show_bridged_mode(struct device *dev,
+- struct device_attribute *attr,
+- char *buf)
++static ssize_t bridged_mode_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ int bridged_mode = 0;
+@@ -69,10 +68,11 @@ static ssize_t qlcnic_show_bridged_mode(struct device *dev,
+
+ return sprintf(buf, "%d\n", bridged_mode);
+ }
++static DEVICE_ATTR_RW(bridged_mode);
+
+-static ssize_t qlcnic_store_diag_mode(struct device *dev,
+- struct device_attribute *attr,
+- const char *buf, size_t len)
++static ssize_t diag_mode_store(struct device *dev,
++ struct device_attribute *attr, const char *buf,
++ size_t len)
+ {
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ unsigned long new;
+@@ -86,12 +86,13 @@ static ssize_t qlcnic_store_diag_mode(struct device *dev,
+ return len;
+ }
+
+-static ssize_t qlcnic_show_diag_mode(struct device *dev,
+- struct device_attribute *attr, char *buf)
++static ssize_t diag_mode_show(struct device *dev, struct device_attribute *attr,
++ char *buf)
+ {
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ return sprintf(buf, "%d\n", !!(adapter->flags & QLCNIC_DIAG_ENABLED));
+ }
++static DEVICE_ATTR_RW(diag_mode);
+
+ static int qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon,
+ u8 *state, u8 *rate)
+@@ -221,9 +222,8 @@ out:
+ return err;
+ }
+
+-static ssize_t qlcnic_store_beacon(struct device *dev,
+- struct device_attribute *attr,
+- const char *buf, size_t len)
++static ssize_t beacon_store(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t len)
+ {
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+ int err = 0;
+@@ -244,8 +244,8 @@ static ssize_t qlcnic_store_beacon(struct device *dev,
+ return err;
+ }
+
+-static ssize_t qlcnic_show_beacon(struct device *dev,
+- struct device_attribute *attr, char *buf)
++static ssize_t beacon_show(struct device *dev, struct device_attribute *attr,
++ char *buf)
+ {
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
+
+@@ -273,6 +273,7 @@ static int qlcnic_sysfs_validate_crb(struct qlcnic_adapter *adapter,
+
+ return 0;
+ }
++static DEVICE_ATTR_RW(beacon);
+
+ static ssize_t qlcnic_sysfs_read_crb(struct file *filp, struct kobject *kobj,
+ struct bin_attribute *attr, char *buf,
+@@ -1155,24 +1156,6 @@ static ssize_t qlcnic_83xx_sysfs_flash_write_handler(struct file *filp,
+ return size;
+ }
+
+-static struct device_attribute dev_attr_bridged_mode = {
+- .attr = {.name = "bridged_mode", .mode = (S_IRUGO | S_IWUSR)},
+- .show = qlcnic_show_bridged_mode,
+- .store = qlcnic_store_bridged_mode,
+-};
+-
+-static struct device_attribute dev_attr_diag_mode = {
+- .attr = {.name = "diag_mode", .mode = (S_IRUGO | S_IWUSR)},
+- .show = qlcnic_show_diag_mode,
+- .store = qlcnic_store_diag_mode,
+-};
+-
+-static struct device_attribute dev_attr_beacon = {
+- .attr = {.name = "beacon", .mode = (S_IRUGO | S_IWUSR)},
+- .show = qlcnic_show_beacon,
+- .store = qlcnic_store_beacon,
+-};
+-
+ static struct bin_attribute bin_attr_crb = {
+ .attr = {.name = "crb", .mode = (S_IRUGO | S_IWUSR)},
+ .size = 0,
+@@ -1236,6 +1219,24 @@ static struct bin_attribute bin_attr_flash = {
+ .write = qlcnic_83xx_sysfs_flash_write_handler,
+ };
+
++static struct attribute *qlcnic_attrs[] = {
++ &dev_attr_diag_mode.attr,
++ NULL,
++};
++
++static struct bin_attribute *qlcnic_bin_attrs[] = {
++ &bin_attr_esw_config,
++ &bin_attr_pm_config,
++ &bin_attr_flash,
++ NULL,
++};
++
++static const struct attribute_group qlcnic_attr = {
++ .attrs = qlcnic_attrs,
++ .bin_attrs = qlcnic_bin_attrs,
++};
++
++
+ void qlcnic_create_sysfs_entries(struct qlcnic_adapter *adapter)
+ {
+ struct device *dev = &adapter->pdev->dev;
+@@ -1257,6 +1258,11 @@ void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter)
+ void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
+ {
+ struct device *dev = &adapter->pdev->dev;
++ int err;
++
++ err = sysfs_create_group(&dev->kobj, &qlcnic_attr);
++ if (err)
++ dev_err(dev, "error creating sysfs files\n");
+
+ if (device_create_bin_file(dev, &bin_attr_port_stats))
+ dev_info(dev, "failed to create port stats sysfs entry");
diff --git a/serial-8250_pci-add-support-for-fintek-4-8-and-12-port-cards.patch b/serial-8250_pci-add-support-for-fintek-4-8-and-12-port-cards.patch
new file mode 100644
index 00000000000000..a03b82c975346e
--- /dev/null
+++ b/serial-8250_pci-add-support-for-fintek-4-8-and-12-port-cards.patch
@@ -0,0 +1,199 @@
+From foo@baz Mon Aug 19 12:48:43 PDT 2013
+Date: Mon, 19 Aug 2013 12:48:43 -0700
+To: Greg KH <gregkh@linuxfoundation.org>
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Subject: [PATCH]: serial: 8250_pci: add support for Fintek 4, 8, and 12 port cards
+
+This adds support for Fintek's 4, 8, and 12 port PCIE serial cards.
+
+Thanks to Fintek for the sample devices, and the spec needed in order to
+implement this.
+
+
+Cc: Amanda Ying <amanda_ying@fintek.com.tw>
+Cc: Felix Shih <felix_shih@fintek.com.tw>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ drivers/tty/serial/8250/8250_pci.c | 134 ++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 133 insertions(+), 1 deletion(-)
+
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -27,7 +27,7 @@
+
+ #include "8250.h"
+
+-#undef SERIAL_DEBUG_PCI
++#define SERIAL_DEBUG_PCI
+
+ /*
+ * init function returns:
+@@ -1344,6 +1344,94 @@ pci_brcm_trumanage_setup(struct serial_p
+ return ret;
+ }
+
++static int pci_fintek_setup(struct serial_private *priv,
++ const struct pciserial_board *board,
++ struct uart_8250_port *port, int idx)
++{
++ int ret;
++
++ switch (idx) {
++ case 0:
++ case 1:
++ case 2:
++ case 3:
++ break;
++ case 4:
++ case 5:
++ case 6:
++ case 7:
++ break;
++ case 8:
++ case 9:
++ case 10:
++ case 11:
++ break;
++ default:
++ /* Unknown number of ports, get out of here */
++ return -EINVAL;
++ }
++
++ ret = pci_default_setup(priv, board, port, idx);
++ return ret;
++#if 0
++static int
++setup_port(struct serial_private *priv, struct uart_8250_port *port,
++ int bar, int offset, int regshift)
++{
++ struct pci_dev *dev = priv->dev;
++ unsigned long base, len;
++
++ if (bar >= PCI_NUM_BAR_RESOURCES)
++ return -EINVAL;
++
++ base = pci_resource_start(dev, bar);
++
++ if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) {
++ len = pci_resource_len(dev, bar);
++
++ if (!priv->remapped_bar[bar])
++ priv->remapped_bar[bar] = ioremap_nocache(base, len);
++ if (!priv->remapped_bar[bar])
++ return -ENOMEM;
++
++ port->port.iotype = UPIO_MEM;
++ port->port.iobase = 0;
++ port->port.mapbase = base + offset;
++ port->port.membase = priv->remapped_bar[bar] + offset;
++ port->port.regshift = regshift;
++ } else {
++ port->port.iotype = UPIO_PORT;
++ port->port.iobase = base + offset;
++ port->port.mapbase = 0;
++ port->port.membase = NULL;
++ port->port.regshift = 0;
++ }
++ return 0;
++}
++static int pci_default_setup(struct serial_private *priv,
++ const struct pciserial_board *board,
++ struct uart_8250_port *port, int idx)
++{
++ unsigned int bar, offset = board->first_offset, maxnr;
++
++ bar = FL_GET_BASE(board->flags);
++ if (board->flags & FL_BASE_BARS)
++ bar += idx;
++ else
++ offset += idx * board->uart_offset;
++
++ maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
++ (board->reg_shift + 3);
++
++ if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
++ return 1;
++
++ return setup_port(priv, port, bar, offset, board->reg_shift);
++}
++#endif
++
++}
++
+ static int skip_tx_en_setup(struct serial_private *priv,
+ const struct pciserial_board *board,
+ struct uart_8250_port *port, int idx)
+@@ -2254,6 +2342,27 @@ static struct pci_serial_quirk pci_seria
+ .subdevice = PCI_ANY_ID,
+ .setup = pci_brcm_trumanage_setup,
+ },
++ {
++ .vendor = 0x1c29,
++ .device = 0x1104,
++ .subvendor = PCI_ANY_ID,
++ .subdevice = PCI_ANY_ID,
++ .setup = pci_fintek_setup,
++ },
++ {
++ .vendor = 0x1c29,
++ .device = 0x1108,
++ .subvendor = PCI_ANY_ID,
++ .subdevice = PCI_ANY_ID,
++ .setup = pci_fintek_setup,
++ },
++ {
++ .vendor = 0x1c29,
++ .device = 0x1112,
++ .subvendor = PCI_ANY_ID,
++ .subdevice = PCI_ANY_ID,
++ .setup = pci_fintek_setup,
++ },
+
+ /*
+ * Default "match everything" terminator entry
+@@ -2451,6 +2560,9 @@ enum pci_board_num_t {
+ pbn_omegapci,
+ pbn_NETMOS9900_2s_115200,
+ pbn_brcm_trumanage,
++ pbn_fintek_4,
++ pbn_fintek_8,
++ pbn_fintek_12,
+ };
+
+ /*
+@@ -3201,6 +3313,21 @@ static struct pciserial_board pci_boards
+ .reg_shift = 2,
+ .base_baud = 115200,
+ },
++ [pbn_fintek_4] = {
++ .num_ports = 4,
++ .uart_offset = 8,
++ .first_offset = 0x40,
++ },
++ [pbn_fintek_8] = {
++ .num_ports = 8,
++ .uart_offset = 8,
++ .first_offset = 0x40,
++ },
++ [pbn_fintek_12] = {
++ .num_ports = 12,
++ .uart_offset = 8,
++ .first_offset = 0x40,
++ },
+ };
+
+ static const struct pci_device_id blacklist[] = {
+@@ -4911,6 +5038,11 @@ static struct pci_device_id serial_pci_t
+ 0,
+ 0, pbn_exar_XR17V358 },
+
++ /* Fintek PCI serial cards */
++ { PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
++ { PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
++ { PCI_DEVICE(0x1c29, 0x1112), .driver_data = pbn_fintek_12 },
++
+ /*
+ * These entries match devices with class COMMUNICATION_SERIAL,
+ * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
diff --git a/series b/series
index 8b8ea1188447fc..2c1b90c9348813 100644
--- a/series
+++ b/series
@@ -1,3 +1,5 @@
+serial-8250_pci-add-support-for-fintek-4-8-and-12-port-cards.patch
+
# patches already in my git trees, but still here so I don't loose them.
kobject-delayed-kobject-release-help-find-buggy-drivers.patch
applied/misc-c2port-use-dev_bin_attrs-instead-of-hand-coding-it.patch
@@ -96,3 +98,5 @@ f1.patch
f2.patch
f3.patch
f4.patch
+
+qlcnic_sysfs.patch