s390/qeth: fix SETIP command handling
[pandora-kernel.git] / drivers / s390 / net / qeth_core.h
index 26a4110..be1d5b5 100644 (file)
@@ -110,6 +110,10 @@ struct qeth_perf_stats {
 
        unsigned int sc_dp_p;
        unsigned int sc_p_dp;
+       /* qdio_cq_handler: number of times called, time spent in */
+       __u64 cq_start_time;
+       unsigned int cq_cnt;
+       unsigned int cq_time;
        /* qdio_input_handler: number of times called, time spent in */
        __u64 inbound_start_time;
        unsigned int inbound_cnt;
@@ -213,6 +217,7 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
  */
 #define QETH_TX_TIMEOUT                100 * HZ
 #define QETH_RCD_TIMEOUT       60 * HZ
+#define QETH_RECLAIM_WORK_TIME HZ
 #define QETH_HEADER_SIZE       32
 #define QETH_MAX_PORTNO                15
 
@@ -231,7 +236,7 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
 #define QETH_IN_BUF_COUNT_MAX 128
 #define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12)
 #define QETH_IN_BUF_REQUEUE_THRESHOLD(card) \
-               ((card)->qdio.in_buf_pool.buf_count / 2)
+                ((card)->qdio.in_buf_pool.buf_count / 2)
 
 /* buffers we have to be behind before we get a PCI */
 #define QETH_PCI_THRESHOLD_A(card) ((card)->qdio.in_buf_pool.buf_count+1)
@@ -260,6 +265,7 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
 
 /* large receive scatter gather copy break */
 #define QETH_RX_SG_CB (PAGE_SIZE >> 1)
+#define QETH_RX_PULL_LEN 256
 
 struct qeth_hdr_layer3 {
        __u8  id;
@@ -375,6 +381,21 @@ enum qeth_qdio_buffer_states {
         * outbound: filled by driver; owned by hardware in order to be sent
         */
        QETH_QDIO_BUF_PRIMED,
+       /*
+        * inbound: not applicable
+        * outbound: identified to be pending in TPQ
+        */
+       QETH_QDIO_BUF_PENDING,
+       /*
+        * inbound: not applicable
+        * outbound: found in completion queue
+        */
+       QETH_QDIO_BUF_IN_CQ,
+       /*
+        * inbound: not applicable
+        * outbound: handled via transfer pending / completion queue
+        */
+       QETH_QDIO_BUF_HANDLED_DELAYED,
 };
 
 enum qeth_qdio_info_states {
@@ -399,6 +420,7 @@ struct qeth_qdio_buffer {
        struct qdio_buffer *buffer;
        /* the buffer pool entry currently associated to this buffer */
        struct qeth_buffer_pool_entry *pool_entry;
+       struct sk_buff *rx_skb;
 };
 
 struct qeth_qdio_q {
@@ -412,8 +434,11 @@ struct qeth_qdio_out_buffer {
        atomic_t state;
        int next_element_to_fill;
        struct sk_buff_head skb_list;
-       struct list_head ctx_list;
        int is_header[16];
+
+       struct qaob *aob;
+       struct qeth_qdio_out_q *q;
+       struct qeth_qdio_out_buffer *next_pending;
 };
 
 struct qeth_card;
@@ -426,7 +451,8 @@ enum qeth_out_q_states {
 
 struct qeth_qdio_out_q {
        struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q];
-       struct qeth_qdio_out_buffer bufs[QDIO_MAX_BUFFERS_PER_Q];
+       struct qeth_qdio_out_buffer *bufs[QDIO_MAX_BUFFERS_PER_Q];
+       struct qdio_outbuf_state *bufstates; /* convenience pointer */
        int queue_no;
        struct qeth_card *card;
        atomic_t state;
@@ -447,7 +473,9 @@ struct qeth_qdio_out_q {
 struct qeth_qdio_info {
        atomic_t state;
        /* input */
+       int no_in_queues;
        struct qeth_qdio_q *in_q;
+       struct qeth_qdio_q *c_q;
        struct qeth_qdio_buffer_pool in_buf_pool;
        struct qeth_qdio_buffer_pool init_pool;
        int in_buf_size;
@@ -455,6 +483,7 @@ struct qeth_qdio_info {
        /* output */
        int no_out_queues;
        struct qeth_qdio_out_q **out_qs;
+       struct qdio_outbuf_state *out_bufstates;
 
        /* priority queueing */
        int do_prio_queueing;
@@ -526,6 +555,12 @@ enum qeth_cmd_buffer_state {
        BUF_STATE_PROCESSED,
 };
 
+enum qeth_cq {
+       QETH_CQ_DISABLED = 0,
+       QETH_CQ_ENABLED = 1,
+       QETH_CQ_NOTAVAILABLE = 2,
+};
+
 struct qeth_ipato {
        int enabled;
        int invert4;
@@ -543,6 +578,11 @@ struct qeth_cmd_buffer {
        void (*callback) (struct qeth_channel *, struct qeth_cmd_buffer *);
 };
 
+static inline struct qeth_ipa_cmd *__ipa_cmd(struct qeth_cmd_buffer *iob)
+{
+       return (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
+}
+
 /**
  * definition of a qeth channel, used for read and write
  */
@@ -650,6 +690,8 @@ struct qeth_card_options {
        int rx_sg_cb;
        enum qeth_ipa_isolation_modes isolation;
        int sniffer;
+       enum qeth_cq cq;
+       char hsuid[9];
 };
 
 /*
@@ -747,6 +789,8 @@ struct qeth_card {
        struct mutex discipline_mutex;
        struct napi_struct napi;
        struct qeth_rx rx;
+       struct delayed_work buffer_reclaim_work;
+       int reclaim_index;
 };
 
 struct qeth_card_list_struct {
@@ -812,6 +856,7 @@ int qeth_core_create_device_attributes(struct device *);
 void qeth_core_remove_device_attributes(struct device *);
 int qeth_core_create_osn_attributes(struct device *);
 void qeth_core_remove_osn_attributes(struct device *);
+void qeth_buffer_reclaim_work(struct work_struct *);
 
 /* exports for qeth discipline device drivers */
 extern struct qeth_card_list_struct qeth_core_card_list;
@@ -840,7 +885,7 @@ int qeth_check_qdio_errors(struct qeth_card *, struct qdio_buffer *,
                unsigned int, const char *);
 void qeth_queue_input_buffer(struct qeth_card *, int);
 struct sk_buff *qeth_core_get_next_skb(struct qeth_card *,
-               struct qdio_buffer *, struct qdio_buffer_element **, int *,
+               struct qeth_qdio_buffer *, struct qdio_buffer_element **, int *,
                struct qeth_hdr **);
 void qeth_schedule_recovery(struct qeth_card *);
 void qeth_qdio_start_poll(struct ccw_device *, int, unsigned long);
@@ -887,6 +932,7 @@ void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...);
 int qeth_core_ethtool_get_settings(struct net_device *, struct ethtool_cmd *);
 int qeth_set_access_ctrl_online(struct qeth_card *card);
 int qeth_hdr_chk_and_bounce(struct sk_buff *, int);
+int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
 int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
 int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot);