#define GVE_RX_BUFFER_SIZE_DQO 2048
  
 +#define GVE_XDP_ACTIONS 5
 +
 +#define GVE_TX_MAX_HEADER_SIZE 182
 +
+ #define GVE_GQ_TX_MIN_PKT_DESC_BYTES 182
+ 
  /* Each slot in the desc ring has a 1:1 mapping to a slot in the data ring */
  struct gve_rx_desc_queue {
        struct gve_rx_desc *desc_ring; /* the descriptor ring */
 
        int off;
        int err;
  
-       if (!so->bound)
+       if (!so->bound || so->tx.state == ISOTP_SHUTDOWN)
                return -EADDRNOTAVAIL;
  
+ wait_free_buffer:
        /* we do not support multiple buffers - for now */
-       if (cmpxchg(&so->tx.state, ISOTP_IDLE, ISOTP_SENDING) != ISOTP_IDLE ||
-           wq_has_sleeper(&so->wait)) {
-               if (msg->msg_flags & MSG_DONTWAIT) {
-                       err = -EAGAIN;
-                       goto err_out;
-               }
+       if (wq_has_sleeper(&so->wait) && (msg->msg_flags & MSG_DONTWAIT))
+               return -EAGAIN;
  
-               /* wait for complete transmission of current pdu */
-               err = wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE);
-               if (err)
-                       goto err_out;
+       /* wait for complete transmission of current pdu */
+       err = wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE);
+       if (err)
+               goto err_event_drop;
  
-               so->tx.state = ISOTP_SENDING;
+       if (cmpxchg(&so->tx.state, ISOTP_IDLE, ISOTP_SENDING) != ISOTP_IDLE) {
+               if (so->tx.state == ISOTP_SHUTDOWN)
+                       return -EADDRNOTAVAIL;
+ 
+               goto wait_free_buffer;
        }
  
 -      if (!size || size > MAX_MSG_LENGTH) {
 +      /* PDU size > default => try max_pdu_size */
 +      if (size > so->tx.buflen && so->tx.buflen < max_pdu_size) {
 +              u8 *newbuf = kmalloc(max_pdu_size, GFP_KERNEL);
 +
 +              if (newbuf) {
 +                      so->tx.buf = newbuf;
 +                      so->tx.buflen = max_pdu_size;
 +              }
 +      }
 +
 +      if (!size || size > so->tx.buflen) {
                err = -EINVAL;
                goto err_out_drop;
        }