The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/e1000/e1000_mbx.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /******************************************************************************
    2 
    3   Copyright (c) 2001-2010, Intel Corporation 
    4   All rights reserved.
    5   
    6   Redistribution and use in source and binary forms, with or without 
    7   modification, are permitted provided that the following conditions are met:
    8   
    9    1. Redistributions of source code must retain the above copyright notice, 
   10       this list of conditions and the following disclaimer.
   11   
   12    2. Redistributions in binary form must reproduce the above copyright 
   13       notice, this list of conditions and the following disclaimer in the 
   14       documentation and/or other materials provided with the distribution.
   15   
   16    3. Neither the name of the Intel Corporation nor the names of its 
   17       contributors may be used to endorse or promote products derived from 
   18       this software without specific prior written permission.
   19   
   20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
   22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
   23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
   24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
   25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
   26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
   27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
   28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
   29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   30   POSSIBILITY OF SUCH DAMAGE.
   31 
   32 ******************************************************************************/
   33 /*$FreeBSD: releng/9.0/sys/dev/e1000/e1000_mbx.c 218530 2011-02-11 01:00:26Z jfv $*/
   34 
   35 #include "e1000_mbx.h"
   36 
   37 /**
   38  *  e1000_null_mbx_check_for_flag - No-op function, return 0
   39  *  @hw: pointer to the HW structure
   40  **/
   41 static s32 e1000_null_mbx_check_for_flag(struct e1000_hw *hw, u16 mbx_id)
   42 {
   43         DEBUGFUNC("e1000_null_mbx_check_flag");
   44 
   45         return E1000_SUCCESS;
   46 }
   47 
   48 /**
   49  *  e1000_null_mbx_transact - No-op function, return 0
   50  *  @hw: pointer to the HW structure
   51  **/
   52 static s32 e1000_null_mbx_transact(struct e1000_hw *hw, u32 *msg, u16 size,
   53                             u16 mbx_id)
   54 {
   55         DEBUGFUNC("e1000_null_mbx_rw_msg");
   56 
   57         return E1000_SUCCESS;
   58 }
   59 
   60 /**
   61  *  e1000_read_mbx - Reads a message from the mailbox
   62  *  @hw: pointer to the HW structure
   63  *  @msg: The message buffer
   64  *  @size: Length of buffer
   65  *  @mbx_id: id of mailbox to read
   66  *
   67  *  returns SUCCESS if it successfuly read message from buffer
   68  **/
   69 s32 e1000_read_mbx(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id)
   70 {
   71         struct e1000_mbx_info *mbx = &hw->mbx;
   72         s32 ret_val = -E1000_ERR_MBX;
   73 
   74         DEBUGFUNC("e1000_read_mbx");
   75 
   76         /* limit read to size of mailbox */
   77         if (size > mbx->size)
   78                 size = mbx->size;
   79 
   80         if (mbx->ops.read)
   81                 ret_val = mbx->ops.read(hw, msg, size, mbx_id);
   82 
   83         return ret_val;
   84 }
   85 
   86 /**
   87  *  e1000_write_mbx - Write a message to the mailbox
   88  *  @hw: pointer to the HW structure
   89  *  @msg: The message buffer
   90  *  @size: Length of buffer
   91  *  @mbx_id: id of mailbox to write
   92  *
   93  *  returns SUCCESS if it successfully copied message into the buffer
   94  **/
   95 s32 e1000_write_mbx(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id)
   96 {
   97         struct e1000_mbx_info *mbx = &hw->mbx;
   98         s32 ret_val = E1000_SUCCESS;
   99 
  100         DEBUGFUNC("e1000_write_mbx");
  101 
  102         if (size > mbx->size)
  103                 ret_val = -E1000_ERR_MBX;
  104 
  105         else if (mbx->ops.write)
  106                 ret_val = mbx->ops.write(hw, msg, size, mbx_id);
  107 
  108         return ret_val;
  109 }
  110 
  111 /**
  112  *  e1000_check_for_msg - checks to see if someone sent us mail
  113  *  @hw: pointer to the HW structure
  114  *  @mbx_id: id of mailbox to check
  115  *
  116  *  returns SUCCESS if the Status bit was found or else ERR_MBX
  117  **/
  118 s32 e1000_check_for_msg(struct e1000_hw *hw, u16 mbx_id)
  119 {
  120         struct e1000_mbx_info *mbx = &hw->mbx;
  121         s32 ret_val = -E1000_ERR_MBX;
  122 
  123         DEBUGFUNC("e1000_check_for_msg");
  124 
  125         if (mbx->ops.check_for_msg)
  126                 ret_val = mbx->ops.check_for_msg(hw, mbx_id);
  127 
  128         return ret_val;
  129 }
  130 
  131 /**
  132  *  e1000_check_for_ack - checks to see if someone sent us ACK
  133  *  @hw: pointer to the HW structure
  134  *  @mbx_id: id of mailbox to check
  135  *
  136  *  returns SUCCESS if the Status bit was found or else ERR_MBX
  137  **/
  138 s32 e1000_check_for_ack(struct e1000_hw *hw, u16 mbx_id)
  139 {
  140         struct e1000_mbx_info *mbx = &hw->mbx;
  141         s32 ret_val = -E1000_ERR_MBX;
  142 
  143         DEBUGFUNC("e1000_check_for_ack");
  144 
  145         if (mbx->ops.check_for_ack)
  146                 ret_val = mbx->ops.check_for_ack(hw, mbx_id);
  147 
  148         return ret_val;
  149 }
  150 
  151 /**
  152  *  e1000_check_for_rst - checks to see if other side has reset
  153  *  @hw: pointer to the HW structure
  154  *  @mbx_id: id of mailbox to check
  155  *
  156  *  returns SUCCESS if the Status bit was found or else ERR_MBX
  157  **/
  158 s32 e1000_check_for_rst(struct e1000_hw *hw, u16 mbx_id)
  159 {
  160         struct e1000_mbx_info *mbx = &hw->mbx;
  161         s32 ret_val = -E1000_ERR_MBX;
  162 
  163         DEBUGFUNC("e1000_check_for_rst");
  164 
  165         if (mbx->ops.check_for_rst)
  166                 ret_val = mbx->ops.check_for_rst(hw, mbx_id);
  167 
  168         return ret_val;
  169 }
  170 
  171 /**
  172  *  e1000_poll_for_msg - Wait for message notification
  173  *  @hw: pointer to the HW structure
  174  *  @mbx_id: id of mailbox to write
  175  *
  176  *  returns SUCCESS if it successfully received a message notification
  177  **/
  178 static s32 e1000_poll_for_msg(struct e1000_hw *hw, u16 mbx_id)
  179 {
  180         struct e1000_mbx_info *mbx = &hw->mbx;
  181         int countdown = mbx->timeout;
  182 
  183         DEBUGFUNC("e1000_poll_for_msg");
  184 
  185         if (!countdown || !mbx->ops.check_for_msg)
  186                 goto out;
  187 
  188         while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) {
  189                 countdown--;
  190                 if (!countdown)
  191                         break;
  192                 usec_delay(mbx->usec_delay);
  193         }
  194 
  195         /* if we failed, all future posted messages fail until reset */
  196         if (!countdown)
  197                 mbx->timeout = 0;
  198 out:
  199         return countdown ? E1000_SUCCESS : -E1000_ERR_MBX;
  200 }
  201 
  202 /**
  203  *  e1000_poll_for_ack - Wait for message acknowledgement
  204  *  @hw: pointer to the HW structure
  205  *  @mbx_id: id of mailbox to write
  206  *
  207  *  returns SUCCESS if it successfully received a message acknowledgement
  208  **/
  209 static s32 e1000_poll_for_ack(struct e1000_hw *hw, u16 mbx_id)
  210 {
  211         struct e1000_mbx_info *mbx = &hw->mbx;
  212         int countdown = mbx->timeout;
  213 
  214         DEBUGFUNC("e1000_poll_for_ack");
  215 
  216         if (!countdown || !mbx->ops.check_for_ack)
  217                 goto out;
  218 
  219         while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) {
  220                 countdown--;
  221                 if (!countdown)
  222                         break;
  223                 usec_delay(mbx->usec_delay);
  224         }
  225 
  226         /* if we failed, all future posted messages fail until reset */
  227         if (!countdown)
  228                 mbx->timeout = 0;
  229 out:
  230         return countdown ? E1000_SUCCESS : -E1000_ERR_MBX;
  231 }
  232 
  233 /**
  234  *  e1000_read_posted_mbx - Wait for message notification and receive message
  235  *  @hw: pointer to the HW structure
  236  *  @msg: The message buffer
  237  *  @size: Length of buffer
  238  *  @mbx_id: id of mailbox to write
  239  *
  240  *  returns SUCCESS if it successfully received a message notification and
  241  *  copied it into the receive buffer.
  242  **/
  243 s32 e1000_read_posted_mbx(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id)
  244 {
  245         struct e1000_mbx_info *mbx = &hw->mbx;
  246         s32 ret_val = -E1000_ERR_MBX;
  247 
  248         DEBUGFUNC("e1000_read_posted_mbx");
  249 
  250         if (!mbx->ops.read)
  251                 goto out;
  252 
  253         ret_val = e1000_poll_for_msg(hw, mbx_id);
  254 
  255         /* if ack received read message, otherwise we timed out */
  256         if (!ret_val)
  257                 ret_val = mbx->ops.read(hw, msg, size, mbx_id);
  258 out:
  259         return ret_val;
  260 }
  261 
  262 /**
  263  *  e1000_write_posted_mbx - Write a message to the mailbox, wait for ack
  264  *  @hw: pointer to the HW structure
  265  *  @msg: The message buffer
  266  *  @size: Length of buffer
  267  *  @mbx_id: id of mailbox to write
  268  *
  269  *  returns SUCCESS if it successfully copied message into the buffer and
  270  *  received an ack to that message within delay * timeout period
  271  **/
  272 s32 e1000_write_posted_mbx(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id)
  273 {
  274         struct e1000_mbx_info *mbx = &hw->mbx;
  275         s32 ret_val = -E1000_ERR_MBX;
  276 
  277         DEBUGFUNC("e1000_write_posted_mbx");
  278 
  279         /* exit if either we can't write or there isn't a defined timeout */
  280         if (!mbx->ops.write || !mbx->timeout)
  281                 goto out;
  282 
  283         /* send msg */
  284         ret_val = mbx->ops.write(hw, msg, size, mbx_id);
  285 
  286         /* if msg sent wait until we receive an ack */
  287         if (!ret_val)
  288                 ret_val = e1000_poll_for_ack(hw, mbx_id);
  289 out:
  290         return ret_val;
  291 }
  292 
  293 /**
  294  *  e1000_init_mbx_ops_generic - Initialize mbx function pointers
  295  *  @hw: pointer to the HW structure
  296  *
  297  *  Sets the function pointers to no-op functions
  298  **/
  299 void e1000_init_mbx_ops_generic(struct e1000_hw *hw)
  300 {
  301         struct e1000_mbx_info *mbx = &hw->mbx;
  302         mbx->ops.init_params = e1000_null_ops_generic;
  303         mbx->ops.read = e1000_null_mbx_transact;
  304         mbx->ops.write = e1000_null_mbx_transact;
  305         mbx->ops.check_for_msg = e1000_null_mbx_check_for_flag;
  306         mbx->ops.check_for_ack = e1000_null_mbx_check_for_flag;
  307         mbx->ops.check_for_rst = e1000_null_mbx_check_for_flag;
  308         mbx->ops.read_posted = e1000_read_posted_mbx;
  309         mbx->ops.write_posted = e1000_write_posted_mbx;
  310 }
  311 
  312 /**
  313  *  e1000_read_v2p_mailbox - read v2p mailbox
  314  *  @hw: pointer to the HW structure
  315  *
  316  *  This function is used to read the v2p mailbox without losing the read to
  317  *  clear status bits.
  318  **/
  319 static u32 e1000_read_v2p_mailbox(struct e1000_hw *hw)
  320 {
  321         u32 v2p_mailbox = E1000_READ_REG(hw, E1000_V2PMAILBOX(0));
  322 
  323         v2p_mailbox |= hw->dev_spec.vf.v2p_mailbox;
  324         hw->dev_spec.vf.v2p_mailbox |= v2p_mailbox & E1000_V2PMAILBOX_R2C_BITS;
  325 
  326         return v2p_mailbox;
  327 }
  328 
  329 /**
  330  *  e1000_check_for_bit_vf - Determine if a status bit was set
  331  *  @hw: pointer to the HW structure
  332  *  @mask: bitmask for bits to be tested and cleared
  333  *
  334  *  This function is used to check for the read to clear bits within
  335  *  the V2P mailbox.
  336  **/
  337 static s32 e1000_check_for_bit_vf(struct e1000_hw *hw, u32 mask)
  338 {
  339         u32 v2p_mailbox = e1000_read_v2p_mailbox(hw);
  340         s32 ret_val = -E1000_ERR_MBX;
  341 
  342         if (v2p_mailbox & mask)
  343                 ret_val = E1000_SUCCESS;
  344 
  345         hw->dev_spec.vf.v2p_mailbox &= ~mask;
  346 
  347         return ret_val;
  348 }
  349 
  350 /**
  351  *  e1000_check_for_msg_vf - checks to see if the PF has sent mail
  352  *  @hw: pointer to the HW structure
  353  *  @mbx_id: id of mailbox to check
  354  *
  355  *  returns SUCCESS if the PF has set the Status bit or else ERR_MBX
  356  **/
  357 static s32 e1000_check_for_msg_vf(struct e1000_hw *hw, u16 mbx_id)
  358 {
  359         s32 ret_val = -E1000_ERR_MBX;
  360 
  361         DEBUGFUNC("e1000_check_for_msg_vf");
  362 
  363         if (!e1000_check_for_bit_vf(hw, E1000_V2PMAILBOX_PFSTS)) {
  364                 ret_val = E1000_SUCCESS;
  365                 hw->mbx.stats.reqs++;
  366         }
  367 
  368         return ret_val;
  369 }
  370 
  371 /**
  372  *  e1000_check_for_ack_vf - checks to see if the PF has ACK'd
  373  *  @hw: pointer to the HW structure
  374  *  @mbx_id: id of mailbox to check
  375  *
  376  *  returns SUCCESS if the PF has set the ACK bit or else ERR_MBX
  377  **/
  378 static s32 e1000_check_for_ack_vf(struct e1000_hw *hw, u16 mbx_id)
  379 {
  380         s32 ret_val = -E1000_ERR_MBX;
  381 
  382         DEBUGFUNC("e1000_check_for_ack_vf");
  383 
  384         if (!e1000_check_for_bit_vf(hw, E1000_V2PMAILBOX_PFACK)) {
  385                 ret_val = E1000_SUCCESS;
  386                 hw->mbx.stats.acks++;
  387         }
  388 
  389         return ret_val;
  390 }
  391 
  392 /**
  393  *  e1000_check_for_rst_vf - checks to see if the PF has reset
  394  *  @hw: pointer to the HW structure
  395  *  @mbx_id: id of mailbox to check
  396  *
  397  *  returns TRUE if the PF has set the reset done bit or else FALSE
  398  **/
  399 static s32 e1000_check_for_rst_vf(struct e1000_hw *hw, u16 mbx_id)
  400 {
  401         s32 ret_val = -E1000_ERR_MBX;
  402 
  403         DEBUGFUNC("e1000_check_for_rst_vf");
  404 
  405         if (!e1000_check_for_bit_vf(hw, (E1000_V2PMAILBOX_RSTD |
  406                                          E1000_V2PMAILBOX_RSTI))) {
  407                 ret_val = E1000_SUCCESS;
  408                 hw->mbx.stats.rsts++;
  409         }
  410 
  411         return ret_val;
  412 }
  413 
  414 /**
  415  *  e1000_obtain_mbx_lock_vf - obtain mailbox lock
  416  *  @hw: pointer to the HW structure
  417  *
  418  *  return SUCCESS if we obtained the mailbox lock
  419  **/
  420 static s32 e1000_obtain_mbx_lock_vf(struct e1000_hw *hw)
  421 {
  422         s32 ret_val = -E1000_ERR_MBX;
  423 
  424         DEBUGFUNC("e1000_obtain_mbx_lock_vf");
  425 
  426         /* Take ownership of the buffer */
  427         E1000_WRITE_REG(hw, E1000_V2PMAILBOX(0), E1000_V2PMAILBOX_VFU);
  428 
  429         /* reserve mailbox for vf use */
  430         if (e1000_read_v2p_mailbox(hw) & E1000_V2PMAILBOX_VFU)
  431                 ret_val = E1000_SUCCESS;
  432 
  433         return ret_val;
  434 }
  435 
  436 /**
  437  *  e1000_write_mbx_vf - Write a message to the mailbox
  438  *  @hw: pointer to the HW structure
  439  *  @msg: The message buffer
  440  *  @size: Length of buffer
  441  *  @mbx_id: id of mailbox to write
  442  *
  443  *  returns SUCCESS if it successfully copied message into the buffer
  444  **/
  445 static s32 e1000_write_mbx_vf(struct e1000_hw *hw, u32 *msg, u16 size,
  446                               u16 mbx_id)
  447 {
  448         s32 ret_val;
  449         u16 i;
  450 
  451 
  452         DEBUGFUNC("e1000_write_mbx_vf");
  453 
  454         /* lock the mailbox to prevent pf/vf race condition */
  455         ret_val = e1000_obtain_mbx_lock_vf(hw);
  456         if (ret_val)
  457                 goto out_no_write;
  458 
  459         /* flush msg and acks as we are overwriting the message buffer */
  460         e1000_check_for_msg_vf(hw, 0);
  461         e1000_check_for_ack_vf(hw, 0);
  462 
  463         /* copy the caller specified message to the mailbox memory buffer */
  464         for (i = 0; i < size; i++)
  465                 E1000_WRITE_REG_ARRAY(hw, E1000_VMBMEM(0), i, msg[i]);
  466 
  467         /* update stats */
  468         hw->mbx.stats.msgs_tx++;
  469 
  470         /* Drop VFU and interrupt the PF to tell it a message has been sent */
  471         E1000_WRITE_REG(hw, E1000_V2PMAILBOX(0), E1000_V2PMAILBOX_REQ);
  472 
  473 out_no_write:
  474         return ret_val;
  475 }
  476 
  477 /**
  478  *  e1000_read_mbx_vf - Reads a message from the inbox intended for vf
  479  *  @hw: pointer to the HW structure
  480  *  @msg: The message buffer
  481  *  @size: Length of buffer
  482  *  @mbx_id: id of mailbox to read
  483  *
  484  *  returns SUCCESS if it successfuly read message from buffer
  485  **/
  486 static s32 e1000_read_mbx_vf(struct e1000_hw *hw, u32 *msg, u16 size,
  487                              u16 mbx_id)
  488 {
  489         s32 ret_val = E1000_SUCCESS;
  490         u16 i;
  491 
  492         DEBUGFUNC("e1000_read_mbx_vf");
  493 
  494         /* lock the mailbox to prevent pf/vf race condition */
  495         ret_val = e1000_obtain_mbx_lock_vf(hw);
  496         if (ret_val)
  497                 goto out_no_read;
  498 
  499         /* copy the message from the mailbox memory buffer */
  500         for (i = 0; i < size; i++)
  501                 msg[i] = E1000_READ_REG_ARRAY(hw, E1000_VMBMEM(0), i);
  502 
  503         /* Acknowledge receipt and release mailbox, then we're done */
  504         E1000_WRITE_REG(hw, E1000_V2PMAILBOX(0), E1000_V2PMAILBOX_ACK);
  505 
  506         /* update stats */
  507         hw->mbx.stats.msgs_rx++;
  508 
  509 out_no_read:
  510         return ret_val;
  511 }
  512 
  513 /**
  514  *  e1000_init_mbx_params_vf - set initial values for vf mailbox
  515  *  @hw: pointer to the HW structure
  516  *
  517  *  Initializes the hw->mbx struct to correct values for vf mailbox
  518  */
  519 s32 e1000_init_mbx_params_vf(struct e1000_hw *hw)
  520 {
  521         struct e1000_mbx_info *mbx = &hw->mbx;
  522 
  523         /* start mailbox as timed out and let the reset_hw call set the timeout
  524          * value to begin communications */
  525         mbx->timeout = 0;
  526         mbx->usec_delay = E1000_VF_MBX_INIT_DELAY;
  527 
  528         mbx->size = E1000_VFMAILBOX_SIZE;
  529 
  530         mbx->ops.read = e1000_read_mbx_vf;
  531         mbx->ops.write = e1000_write_mbx_vf;
  532         mbx->ops.read_posted = e1000_read_posted_mbx;
  533         mbx->ops.write_posted = e1000_write_posted_mbx;
  534         mbx->ops.check_for_msg = e1000_check_for_msg_vf;
  535         mbx->ops.check_for_ack = e1000_check_for_ack_vf;
  536         mbx->ops.check_for_rst = e1000_check_for_rst_vf;
  537 
  538         mbx->stats.msgs_tx = 0;
  539         mbx->stats.msgs_rx = 0;
  540         mbx->stats.reqs = 0;
  541         mbx->stats.acks = 0;
  542         mbx->stats.rsts = 0;
  543 
  544         return E1000_SUCCESS;
  545 }
  546 
  547 static s32 e1000_check_for_bit_pf(struct e1000_hw *hw, u32 mask)
  548 {
  549         u32 mbvficr = E1000_READ_REG(hw, E1000_MBVFICR);
  550         s32 ret_val = -E1000_ERR_MBX;
  551 
  552         if (mbvficr & mask) {
  553                 ret_val = E1000_SUCCESS;
  554                 E1000_WRITE_REG(hw, E1000_MBVFICR, mask);
  555         }
  556 
  557         return ret_val;
  558 }
  559 
  560 /**
  561  *  e1000_check_for_msg_pf - checks to see if the VF has sent mail
  562  *  @hw: pointer to the HW structure
  563  *  @vf_number: the VF index
  564  *
  565  *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX
  566  **/
  567 static s32 e1000_check_for_msg_pf(struct e1000_hw *hw, u16 vf_number)
  568 {
  569         s32 ret_val = -E1000_ERR_MBX;
  570 
  571         DEBUGFUNC("e1000_check_for_msg_pf");
  572 
  573         if (!e1000_check_for_bit_pf(hw, E1000_MBVFICR_VFREQ_VF1 << vf_number)) {
  574                 ret_val = E1000_SUCCESS;
  575                 hw->mbx.stats.reqs++;
  576         }
  577 
  578         return ret_val;
  579 }
  580 
  581 /**
  582  *  e1000_check_for_ack_pf - checks to see if the VF has ACKed
  583  *  @hw: pointer to the HW structure
  584  *  @vf_number: the VF index
  585  *
  586  *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX
  587  **/
  588 static s32 e1000_check_for_ack_pf(struct e1000_hw *hw, u16 vf_number)
  589 {
  590         s32 ret_val = -E1000_ERR_MBX;
  591 
  592         DEBUGFUNC("e1000_check_for_ack_pf");
  593 
  594         if (!e1000_check_for_bit_pf(hw, E1000_MBVFICR_VFACK_VF1 << vf_number)) {
  595                 ret_val = E1000_SUCCESS;
  596                 hw->mbx.stats.acks++;
  597         }
  598 
  599         return ret_val;
  600 }
  601 
  602 /**
  603  *  e1000_check_for_rst_pf - checks to see if the VF has reset
  604  *  @hw: pointer to the HW structure
  605  *  @vf_number: the VF index
  606  *
  607  *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX
  608  **/
  609 static s32 e1000_check_for_rst_pf(struct e1000_hw *hw, u16 vf_number)
  610 {
  611         u32 vflre = E1000_READ_REG(hw, E1000_VFLRE);
  612         s32 ret_val = -E1000_ERR_MBX;
  613 
  614         DEBUGFUNC("e1000_check_for_rst_pf");
  615 
  616         if (vflre & (1 << vf_number)) {
  617                 ret_val = E1000_SUCCESS;
  618                 E1000_WRITE_REG(hw, E1000_VFLRE, (1 << vf_number));
  619                 hw->mbx.stats.rsts++;
  620         }
  621 
  622         return ret_val;
  623 }
  624 
  625 /**
  626  *  e1000_obtain_mbx_lock_pf - obtain mailbox lock
  627  *  @hw: pointer to the HW structure
  628  *  @vf_number: the VF index
  629  *
  630  *  return SUCCESS if we obtained the mailbox lock
  631  **/
  632 static s32 e1000_obtain_mbx_lock_pf(struct e1000_hw *hw, u16 vf_number)
  633 {
  634         s32 ret_val = -E1000_ERR_MBX;
  635         u32 p2v_mailbox;
  636 
  637         DEBUGFUNC("e1000_obtain_mbx_lock_pf");
  638 
  639         /* Take ownership of the buffer */
  640         E1000_WRITE_REG(hw, E1000_P2VMAILBOX(vf_number), E1000_P2VMAILBOX_PFU);
  641 
  642         /* reserve mailbox for vf use */
  643         p2v_mailbox = E1000_READ_REG(hw, E1000_P2VMAILBOX(vf_number));
  644         if (p2v_mailbox & E1000_P2VMAILBOX_PFU)
  645                 ret_val = E1000_SUCCESS;
  646 
  647         return ret_val;
  648 }
  649 
  650 /**
  651  *  e1000_write_mbx_pf - Places a message in the mailbox
  652  *  @hw: pointer to the HW structure
  653  *  @msg: The message buffer
  654  *  @size: Length of buffer
  655  *  @vf_number: the VF index
  656  *
  657  *  returns SUCCESS if it successfully copied message into the buffer
  658  **/
  659 static s32 e1000_write_mbx_pf(struct e1000_hw *hw, u32 *msg, u16 size,
  660                               u16 vf_number)
  661 {
  662         s32 ret_val;
  663         u16 i;
  664 
  665         DEBUGFUNC("e1000_write_mbx_pf");
  666 
  667         /* lock the mailbox to prevent pf/vf race condition */
  668         ret_val = e1000_obtain_mbx_lock_pf(hw, vf_number);
  669         if (ret_val)
  670                 goto out_no_write;
  671 
  672         /* flush msg and acks as we are overwriting the message buffer */
  673         e1000_check_for_msg_pf(hw, vf_number);
  674         e1000_check_for_ack_pf(hw, vf_number);
  675 
  676         /* copy the caller specified message to the mailbox memory buffer */
  677         for (i = 0; i < size; i++)
  678                 E1000_WRITE_REG_ARRAY(hw, E1000_VMBMEM(vf_number), i, msg[i]);
  679 
  680         /* Interrupt VF to tell it a message has been sent and release buffer*/
  681         E1000_WRITE_REG(hw, E1000_P2VMAILBOX(vf_number), E1000_P2VMAILBOX_STS);
  682 
  683         /* update stats */
  684         hw->mbx.stats.msgs_tx++;
  685 
  686 out_no_write:
  687         return ret_val;
  688 
  689 }
  690 
  691 /**
  692  *  e1000_read_mbx_pf - Read a message from the mailbox
  693  *  @hw: pointer to the HW structure
  694  *  @msg: The message buffer
  695  *  @size: Length of buffer
  696  *  @vf_number: the VF index
  697  *
  698  *  This function copies a message from the mailbox buffer to the caller's
  699  *  memory buffer.  The presumption is that the caller knows that there was
  700  *  a message due to a VF request so no polling for message is needed.
  701  **/
  702 static s32 e1000_read_mbx_pf(struct e1000_hw *hw, u32 *msg, u16 size,
  703                              u16 vf_number)
  704 {
  705         s32 ret_val;
  706         u16 i;
  707 
  708         DEBUGFUNC("e1000_read_mbx_pf");
  709 
  710         /* lock the mailbox to prevent pf/vf race condition */
  711         ret_val = e1000_obtain_mbx_lock_pf(hw, vf_number);
  712         if (ret_val)
  713                 goto out_no_read;
  714 
  715         /* copy the message to the mailbox memory buffer */
  716         for (i = 0; i < size; i++)
  717                 msg[i] = E1000_READ_REG_ARRAY(hw, E1000_VMBMEM(vf_number), i);
  718 
  719         /* Acknowledge the message and release buffer */
  720         E1000_WRITE_REG(hw, E1000_P2VMAILBOX(vf_number), E1000_P2VMAILBOX_ACK);
  721 
  722         /* update stats */
  723         hw->mbx.stats.msgs_rx++;
  724 
  725 out_no_read:
  726         return ret_val;
  727 }
  728 
  729 /**
  730  *  e1000_init_mbx_params_pf - set initial values for pf mailbox
  731  *  @hw: pointer to the HW structure
  732  *
  733  *  Initializes the hw->mbx struct to correct values for pf mailbox
  734  */
  735 s32 e1000_init_mbx_params_pf(struct e1000_hw *hw)
  736 {
  737         struct e1000_mbx_info *mbx = &hw->mbx;
  738 
  739         switch (hw->mac.type) {
  740         case e1000_82576:
  741         case e1000_i350:
  742                 mbx->timeout = 0;
  743                 mbx->usec_delay = 0;
  744 
  745                 mbx->size = E1000_VFMAILBOX_SIZE;
  746 
  747                 mbx->ops.read = e1000_read_mbx_pf;
  748                 mbx->ops.write = e1000_write_mbx_pf;
  749                 mbx->ops.read_posted = e1000_read_posted_mbx;
  750                 mbx->ops.write_posted = e1000_write_posted_mbx;
  751                 mbx->ops.check_for_msg = e1000_check_for_msg_pf;
  752                 mbx->ops.check_for_ack = e1000_check_for_ack_pf;
  753                 mbx->ops.check_for_rst = e1000_check_for_rst_pf;
  754 
  755                 mbx->stats.msgs_tx = 0;
  756                 mbx->stats.msgs_rx = 0;
  757                 mbx->stats.reqs = 0;
  758                 mbx->stats.acks = 0;
  759                 mbx->stats.rsts = 0;
  760         default:
  761                 return E1000_SUCCESS;
  762         }
  763 }
  764 

Cache object: aea09a6eed074a74ede0a8841288f0f4


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.