Merge branch 'master' into upstream
[powerpc.git] / drivers / net / ehea / ehea_main.c
index 1072e69..88ad1c8 100644 (file)
@@ -76,7 +76,7 @@ void ehea_dump(void *adr, int len, char *msg) {
        int x;
        unsigned char *deb = adr;
        for (x = 0; x < len; x += 16) {
-               printk(DRV_NAME "%s adr=%p ofs=%04x %016lx %016lx\n", msg,
+               printk(DRV_NAME " %s adr=%p ofs=%04x %016lx %016lx\n", msg,
                          deb, x, *((u64*)&deb[0]), *((u64*)&deb[8]));
                deb += 16;
        }
@@ -555,6 +555,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
 {
        struct ehea_port *port = param;
        struct ehea_eqe *eqe;
+       struct ehea_qp *qp;
        u32 qp_token;
 
        eqe = ehea_poll_eq(port->qp_eq);
@@ -563,9 +564,14 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
                qp_token = EHEA_BMASK_GET(EHEA_EQE_QP_TOKEN, eqe->entry);
                ehea_error("QP aff_err: entry=0x%lx, token=0x%x",
                           eqe->entry, qp_token);
+
+               qp = port->port_res[qp_token].qp;
+               ehea_error_data(port->adapter, qp->fw_handle);
                eqe = ehea_poll_eq(port->qp_eq);
        }
 
+       queue_work(port->adapter->ehea_wq, &port->reset_task);
+
        return IRQ_HANDLED;
 }
 
@@ -882,7 +888,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
                         , "%s-recv%d", dev->name, i);
                ret = ibmebus_request_irq(NULL, pr->recv_eq->attr.ist1,
                                          ehea_recv_irq_handler,
-                                         SA_INTERRUPT, pr->int_recv_name, pr);
+                                         IRQF_DISABLED, pr->int_recv_name, pr);
                if (ret) {
                        ehea_error("failed registering irq for ehea_recv_int:"
                                   "port_res_nr:%d, ist=%X", i,
@@ -899,7 +905,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
 
        ret = ibmebus_request_irq(NULL, port->qp_eq->attr.ist1,
                                  ehea_qp_aff_irq_handler,
-                                 SA_INTERRUPT, port->int_aff_name, port);
+                                 IRQF_DISABLED, port->int_aff_name, port);
        if (ret) {
                ehea_error("failed registering irq for qp_aff_irq_handler:"
                           "ist=%X", port->qp_eq->attr.ist1);
@@ -916,7 +922,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
                         "%s-send%d", dev->name, i);
                ret = ibmebus_request_irq(NULL, pr->send_eq->attr.ist1,
                                          ehea_send_irq_handler,
-                                         SA_INTERRUPT, pr->int_send_name,
+                                         IRQF_DISABLED, pr->int_send_name,
                                          pr);
                if (ret) {
                        ehea_error("failed registering irq for ehea_send "
@@ -2316,6 +2322,7 @@ static int ehea_setup_single_port(struct ehea_port *port,
        struct ehea_adapter *adapter = port->adapter;
        struct hcp_ehea_port_cb4 *cb4;
        u32 *dn_log_port_id;
+       int jumbo = 0;
 
        sema_init(&port->port_lock, 1);
        port->state = EHEA_PORT_DOWN;
@@ -2357,13 +2364,25 @@ static int ehea_setup_single_port(struct ehea_port *port,
        if (!cb4) {
                ehea_error("no mem for cb4");
        } else {
-               cb4->jumbo_frame = 1;
-               hret = ehea_h_modify_ehea_port(adapter->handle,
-                                              port->logical_port_id,
-                                              H_PORT_CB4, H_PORT_CB4_JUMBO,
-                                              cb4);
-               if (hret != H_SUCCESS) {
-                       ehea_info("Jumbo frames not activated");
+               hret = ehea_h_query_ehea_port(adapter->handle,
+                                             port->logical_port_id,
+                                             H_PORT_CB4,
+                                             H_PORT_CB4_JUMBO, cb4);
+
+               if (hret == H_SUCCESS) {
+                       if (cb4->jumbo_frame)
+                               jumbo = 1;
+                       else {
+                               cb4->jumbo_frame = 1;
+                               hret = ehea_h_modify_ehea_port(adapter->handle,
+                                                              port->
+                                                               logical_port_id,
+                                                              H_PORT_CB4,
+                                                              H_PORT_CB4_JUMBO,
+                                                              cb4);
+                               if (hret == H_SUCCESS)
+                                       jumbo = 1;
+                       }
                }
                kfree(cb4);
        }
@@ -2402,6 +2421,9 @@ static int ehea_setup_single_port(struct ehea_port *port,
                goto out_free;
        }
 
+       ehea_info("%s: Jumbo frames are %sabled", dev->name,
+                 jumbo == 1 ? "en" : "dis");
+
        port->netdev = dev;
        ret = 0;
        goto out;
@@ -2523,7 +2545,7 @@ static int __devinit ehea_probe(struct ibmebus_dev *dev,
                     (unsigned long)adapter);
 
        ret = ibmebus_request_irq(NULL, adapter->neq->attr.ist1,
-                                 ehea_interrupt_neq, SA_INTERRUPT,
+                                 ehea_interrupt_neq, IRQF_DISABLED,
                                  "ehea_neq", adapter);
        if (ret) {
                dev_err(&dev->ofdev.dev, "requesting NEQ IRQ failed");
@@ -2582,6 +2604,7 @@ static int __devexit ehea_remove(struct ibmebus_dev *dev)
        destroy_workqueue(adapter->ehea_wq);
 
        ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter);
+       tasklet_kill(&adapter->neq_tasklet);
 
        ehea_destroy_eq(adapter->neq);