summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch')
-rw-r--r--target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch100
1 files changed, 100 insertions, 0 deletions
diff --git a/target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch b/target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch
new file mode 100644
index 000000000..409c43c19
--- /dev/null
+++ b/target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch
@@ -0,0 +1,100 @@
+commit c031235b395433350f25943b7580a5e343c7b7b2
+Author: Philip A. Prindeville <philipp@redfish-solutions.com>
+Date: Wed Mar 30 13:17:04 2011 +0000
+
+ atm/solos-pci: Don't flap VCs when carrier state changes
+
+ Don't flap VCs when carrier state changes; higher-level protocols
+ can detect loss of connectivity and act accordingly. This is more
+ consistent with how other network interfaces work.
+
+ We no longer use release_vccs() so we can delete it.
+
+ release_vccs() was duplicated from net/atm/common.c; make the
+ corresponding function exported, since other code duplicates it
+ and could leverage it if it were public.
+
+ Signed-off-by: Philip A. Prindeville <philipp@redfish-solutions.com>
+ Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/atm/solos-pci.c | 26 +-------------------------
+ include/linux/atmdev.h | 1 +
+ net/atm/common.c | 1 +
+ 3 files changed, 3 insertions(+), 25 deletions(-)
+
+--- a/drivers/atm/solos-pci.c
++++ b/drivers/atm/solos-pci.c
+@@ -165,7 +165,6 @@ static uint32_t fpga_tx(struct solos_car
+ static irqreturn_t solos_irq(int irq, void *dev_id);
+ static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci);
+ static int list_vccs(int vci);
+-static void release_vccs(struct atm_dev *dev);
+ static int atm_init(struct solos_card *, struct device *);
+ static void atm_remove(struct solos_card *);
+ static int send_command(struct solos_card *card, int dev, const char *buf, size_t size);
+@@ -384,7 +383,6 @@ static int process_status(struct solos_c
+ /* Anything but 'Showtime' is down */
+ if (strcmp(state_str, "Showtime")) {
+ atm_dev_signal_change(card->atmdev[port], ATM_PHY_SIG_LOST);
+- release_vccs(card->atmdev[port]);
+ dev_info(&card->dev->dev, "Port %d: %s\n", port, state_str);
+ return 0;
+ }
+@@ -830,28 +828,6 @@ static int list_vccs(int vci)
+ return num_found;
+ }
+
+-static void release_vccs(struct atm_dev *dev)
+-{
+- int i;
+-
+- write_lock_irq(&vcc_sklist_lock);
+- for (i = 0; i < VCC_HTABLE_SIZE; i++) {
+- struct hlist_head *head = &vcc_hash[i];
+- struct hlist_node *node, *tmp;
+- struct sock *s;
+- struct atm_vcc *vcc;
+-
+- sk_for_each_safe(s, node, tmp, head) {
+- vcc = atm_sk(s);
+- if (vcc->dev == dev) {
+- vcc_release_async(vcc, -EPIPE);
+- sk_del_node_init(s);
+- }
+- }
+- }
+- write_unlock_irq(&vcc_sklist_lock);
+-}
+-
+
+ static int popen(struct atm_vcc *vcc)
+ {
+@@ -1269,7 +1245,7 @@ static int atm_init(struct solos_card *c
+ card->atmdev[i]->ci_range.vci_bits = 16;
+ card->atmdev[i]->dev_data = card;
+ card->atmdev[i]->phy_data = (void *)(unsigned long)i;
+- atm_dev_signal_change(card->atmdev[i], ATM_PHY_SIG_UNKNOWN);
++ atm_dev_signal_change(card->atmdev[i], ATM_PHY_SIG_FOUND);
+
+ skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
+ if (!skb) {
+--- a/include/linux/atmdev.h
++++ b/include/linux/atmdev.h
+@@ -443,6 +443,7 @@ void atm_dev_signal_change(struct atm_de
+
+ void vcc_insert_socket(struct sock *sk);
+
++void atm_dev_release_vccs(struct atm_dev *dev);
+
+ /*
+ * This is approximately the algorithm used by alloc_skb.
+--- a/net/atm/common.c
++++ b/net/atm/common.c
+@@ -252,6 +252,7 @@ void atm_dev_release_vccs(struct atm_dev
+ }
+ write_unlock_irq(&vcc_sklist_lock);
+ }
++EXPORT_SYMBOL(atm_dev_release_vccs);
+
+ static int adjust_tp(struct atm_trafprm *tp, unsigned char aal)
+ {