diff options
-rw-r--r-- | qlcnic_sysfs.patch | 153 | ||||
-rw-r--r-- | serial-8250_pci-add-support-for-fintek-4-8-and-12-port-cards.patch | 199 | ||||
-rw-r--r-- | series | 4 |
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 @@ -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 |