               Broadcom NetXtreme II Gigabit Ethernet Driver
                      For Solaris 10 for i386 platform

              Copyright (c) 2000-2003 Broadcom Corporation
                         All rights reserved.


Contents 

I.   Introduction

II.  Installing Driver

III. Upgrading the Driver

IV. Uninstalling Driver 

V.  Driver Update (DU) Diskette Instruction (x86 Platform ONLY)

VI.   Customize Driver Configuration using driver.conf file

VII.  Customize Driver Configuration using NDD command

     
I. Introduction
    ============

This file describes the Solaris Release 10 driver for Broadcom's 5706/5708
10/100/1000 Mbps Ethernet Network Interface Controller.  Driver is released 
in three formats:
 
1. BRCMbnx.pkg   : Datastream format.
2. BRCMbnx.tar.Z : Compressed and TAR file system format.
3. bnxdu.img     : Driver Update (DU) binary image which is used to create 
                    DU diskette. 


II. Installing Driver
    =================

1. Change directory to where BRCMbnx.pkg resides.
2. pkgadd -d BRCMbnx.pkg
               OR 
( Copy  BRCMbnx.tar.Z to /tmp.
  cd /tmp
  uncompress BRCMbnx.tar.Z
  tar xvf BRCMbnx.tar
  pkgadd -d /tmp)

3. Execute prtconf to determine instance number of the NIC.
4. ifconfig bnx[instance_number] plumb
5. ifconfig bnx[instance_number] ip_address netmask .... up

To make these changes permanent, follow these steps: 

1. Use your favorite text editor (eg. vi) and create a file named 
   hostname.bnx[instance_number] in /etc directory.  Add the
   IP address of the interface to this file, save and exit. 
2. Add a proper subnet mask to the file /etc/netmasks.]


III. Upgrading the Driver
     =====================

To upgrade the Broadcom driver package to the current version, you must
first uninstall the previous driver version from the system by
following the steps listed in section IV.  Once the previous driver has
been removed, you can follow any of the installation methods in this
document to install the new driver version.

Please note that Broadcom does not support installing multiple
instances of the driver on a single system.


IV. Uninstalling Driver
    ===================

1. ifconfig bnx[instance_number] down
2. ifconfig bnx[instance_number] unplumb
3. pkgrm BRCMbnx.


V.  Driver Update (DU) Diskette Instruction (x86 Platform ONLY)
     ============================================================

This area contains the Solaris diskette image files(s) and the instructions
to create diskettes from these image file(s).

1.  Insert a blank diskette into your machine's diskette drive and type one
    of the following commands to format it:

   * If you are using DOS, type:

     format A:

   * If you are using the Solaris operating environment, type:

     fdformat -Ud

2.  Check to see if Volume Management is running:

   * If you are using DOS, type:

     dd filename A:

   * If you are using the Solaris operating environment, type:

     volcheck
     ls -l /vol/dev/aliases/floppy0


        * If you see a message similar to this:

          lrwxrwxrwx   1 root  34 Jan 21 17:28
          /vol/dev/aliases/floppy0 ->
          /vol/dev/rdiskette0/unnamed_floppy

          Type:

               dd if=bnxdu.img of=/vol/dev/aliases/floppy0
               bs=36k eject floppy0

        * If you see this message:

          /vol/dev/aliases/floppy0 not found

          Type:

               dd if=bnxdu.img of=/dev/rdiskette bs=36k


Installing Solaris DU Diskette(s)

You can use Solaris DU diskettes in one of two ways:

   * To use new drivers to install or upgrade the Solaris operating
     environment on a machine with new hardware

   * To add new drivers to support new hardware on an already installed
     and booted system

Installing Solaris Using DU Diskette(s)

To install Solaris (x86 Platform Edition) using drivers on the DU
diskette:


a) Solaris 10 1/06 and Beyond
==============================

With Solaris 10 1/06 and beyond, the DU may be supplied on a floppy diskette (using a legacy floppy drive).

Step for creating the DU diskette are outlined in section IV(Driver Update (DU) Diskette Instruction (x86 Platform ONLY))
of this document.

1. Boot the Solaris Installation to the following (or similar) menu:

1. Solaris Interactive (default)
2. Custom Jumpstart
3. Solaris Interactive Text (Desktop session)
4. Solaris Interactive Text (Console session)
5. Apply driver updates
6. Single user shell

Enter the number of your choice.

3. Select Apply driver updates (option 5 in the menu above).
4. At the following prompt:

Insert media and enter media type:
Floppy [f], CD/DVD [c] or End [e]
do one of the following:

(a) Insert the DU floppy, and choose 'f'. Solaris will extract the driver, and the following (or similar) 
	messages will indicate success:

	extracting software on floppy
	installing driver update in the miniroot
NOTICE:
Broadcom NetXtreme II Gigabit Ethernet Driver 3.5.1
	
Following driver application, Solaris will return to the following prompt:

Insert media and enter media type:
Floppy [f], CD/DVD [c] or End [e]

Choose e. Solaris will prompt for re-insertion of the Solaris media; complete
this step and proceed with the installation


b) Solaris 10 3/05
==================

1.  Insert the appropriate Configuration Assistant diskette, made from the
included file bnxdu.img into your machine's diskette drive.  Also,
insert the Solaris Installation CD-ROM, or for network installation, verify
with your system administrator that the Solaris network installation image
is available on your network.

2.  Turn your machine on.

3.  When the Configuration Assistant screen is displayed, choose the F4
option (on 2.6, this is labelled F4_Driver Update; on Solaris 7, F4_Add
Driver).

    The message "Enumerating buses ... " is displayed. Then the Install
Driver Update screen is displayed.

4.  Remove the Configuration Assistant diskette from the diskette drive and
insert the first Solaris DU diskette you want.

5.  Press F2_Continue.

    The Select Solaris System Version screen is displayed.

6.  Select the appropriate Solaris OS and press F2_Continue.

The Loading Driver Update Software screen is displayed, along with a
progress bar that shows the percentage of drivers that have been extracted
from the diskette. Drivers are read into memory and survive long enough for
the system to successfully boot to its installation program. When all the
new drivers on the diskette have been processed, the Continue Driver Update
Installation screen is displayed.

7.  Remove the DU diskette from the diskette drive and insert the next DU
diskette you want, if any.

8.  Press F2_Continue.

Again, the Loading Driver Update Software screen is displayed, along with a
progress bar that shows the percentage of drivers that have been extracted
from the diskette. Drivers are read into memory and survive long enough for
the system to successfully boot to its installation program. When all the
new drivers on the diskette have been processed, the Continue Driver Update
Installation screen is displayed.

9.  Repeat Steps 7 and 8 until all the DU diskettes you want are installed.

10. When all the drivers are processed, remove the DU diskette from the
diskette drive and reinsert the Configuration Assistant diskette.

     IMPORTANT: Do not remove the Configuration Assistant diskette from
     the diskette drive until you see the following message displayed
     in a dialog box:

     If you want to bypass the device configuration and boot screens
     when the system reboots, eject the Device Configuration
     Assistant/Boot diskette now.

11. Press F2_Continue.

The Solaris Device Configuration Assistant screen is displayed.

12. Press F2_Continue.

The message "Enumerating buses ..." is displayed.

Then the Scanning Devices screen is displayed. System devices are scanned.
When scanning is complete, the Identified Devices screen is displayed.

13. Press F2_Continue.

 The message "Loading driver ..." is displayed followed by messages about
the drivers that are required to boot your system. After a few seconds, the
Boot Solaris screen is displayed.

14. At the Boot Solaris screen, select the device controller attached to the
device that contains your install medium.

15. Press F2_Continue.

Drivers for the device controller you selected are displayed. Your system
boots to run the install program. The install program starts and your
machine begins booting the complete Solaris operating environment. Then,
after some time, the following messages are displayed, prompting you to
insert each of the Solaris DU diskettes required to install your machine:

     Installing unbundled device driver support
     Extracting driver list from tree..
     <DU diskette name> driver-name...

     Please insert the Driver Update diskette labeled <DU diskette
     name>
     Press <ENTER> when ready.

16. Remove the Configuration Assistant diskette and reinsert the first DU
diskette you inserted earlier into the diskette drive.

17. Press Enter.

Packages, patches, or both that contain the new drivers are installed from
the diskette onto your machine. Messages about each installation are
displayed.

*If drivers on other DU diskettes are required for your machine, this
prompt is displayed:

      Please insert the Driver Update diskette labeled <DU diskette name>
   Press <ENTER> when ready.

*Otherwise, this prompt is displayed:

    If you have additional Update diskettes to install (such as video),
please insert diskette now.
   Additional Update diskettes to install? (y/n) [y]

18. If drivers on other DU diskettes are required, remove the DU diskette
from the diskette drive, insert the next  DU diskette you are prompted to
insert, press Enter, and repeat until all drivers you need are installed.

19. Press Enter.

When installation is complete, the message "Installation complete" is
displayed.

20. Remove the diskette from the diskette drive.

21. Reboot your machine.

When the Solaris operating environment is finished booting and running, the
new devices whose drivers you installed are available for use.

Adding a DU Diskette to an Existing Solaris System

Before adding new or updated drivers, the newly supported hardware devices
should be installed and configured according to the instructions in the
corresponding Device Reference Page, if any. See the Solaris (x86 Platform
Edition) Device Configuration Guide.

When the Solaris (x86 Platform Edition) software is already installed, the
simplest way to add new or updated drivers is to install the DU diskettes as
patches on your system, as follows:

1.  Become superuser on your system.

2.  Check to see if Volume Management is running on the machine you are
updating:

  ps -ef | grep vold

    For more information about managing diskettes and drives, see the System
Administration Guide.

3.  If Volume Management is running, temporarily stop it by typing:

    # /etc/init.d/volmgt stop

4.  Insert the DU diskette into the diskette drive.

5.  Mount the DU diskette at the /mnt mount point:

  # mount -F pcfs /dev/diskette /mnt

  Note: At this point, you must mount the DU diskette in the file structure
to update your system successfully.

6.  Execute the install script on the diskette, using the appropriate
Solaris release directory (currently sol_26 for Solaris 2.6, sol_27 for
Solaris 7, and so on). For example:

    # /mnt/DU/sol_27/i86pc/Tools/install.sh -i

The install.sh script searches for all new or updated drivers on the
diskette. When a new or updated driver is found, the following prompt is
displayed:

    Unconditionally installing DUs <DU driver names>
    Install patch driver-name? [y]

7.  If the driver is the one you want to install, at the prompt, type y for
yes or press Enter. If the driver is not the one you want to install, type n
for no.

If you type y, the install.sh script installs the driver you indicated as
well as the bootmod and bootbin patches.

8.  When you're done and the install.sh script exits, unmount the diskette:

    # cd /
    # umount /mnt

9.  Remove the DU diskette from the diskette drive.

10. Reboot your machine.

  # touch /reconfigure
  # reboot


VI. Customize Driver Configuration
   ==============================
To customize the driver edit "/kernel/drv/bnx.conf" and update the 
respective parameters in this file.  The following describes the meaning 
of these parameters:  

############################################################################
# adv_autoneg_cap: This boolean value configures autonegotiation mode
#   0 : disable
#   1 : enable
#
#adv_autoneg_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# adv_pause_cap: This numerical value configures flow control modes
#   0 : disable
#   1 : Rx only
#   2 : Tx only
#   3 : both Tx & Rx flow control enabled
#   4 : Auto negotiate with the link partner
#
#adv_pause_cap=4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4;




############################################################################
# adv_2500fdx_cap: boolean value - valid only for serdes and is read-only
#	for copper.
#   0 : disable
#   1 : enable
#
#adv_2500fdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# adv_1000fdx_cap: boolean value - valid only for serdes and is read-only
#	for copper.
#   0 : disable
#   1 : enable
#
#adv_1000fdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# adv_1000hdx_cap: boolean value - valid only for serdes and is read-only
#	for copper. This parameter forces serdes link to 1G half duplex mode.
#   0 : disable
#   1 : enable
#
#adv_1000hdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# adv_100fdx_cap: boolean value  - valid for copper devic only and reads '0'
#	for serdes. Forces link to 100mbps full duplex mode of operation
#   0 : disable
#   1 : enable
#
#adv_100fdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# adv_100hdx_cap: boolean value  - valid for copper devic only and reads '0'
#	for serdes. Forces link to 100mbps half duplex mode of operation
#   0 : disable
#   1 : enable
#
#adv_100hdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# adv_10fdx_cap: boolean value  - valid for copper devic only and reads '0'
#	for serdes. Forces link to 100mbps full duplex mode of operation
#   0 : disable
#   1 : enable
#
#adv_10fdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;



############################################################################
# adv_10hdx_cap: boolean value  - valid for copper devic only and reads '0'
#	for serdes. Forces link to 10mbps half duplex mode of operation
#   0 : disable
#   1 : enable
#
#adv_10hdx_cap=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;




############################################################################
# Checksum : configures checksum task which are offloaded to asic,
# namely transport (TCP / UDP) or network (IP) protocol checksum
# offload. By default no checksum is offloaded. Legal values are -
#       0 : No checksum offload.
#       1 : TCP & IP checksum generation is offloaded for outbound packets
#       2 : TCP & IP checksum validation is offloaded for ingress packets
#       3 : Both TCP / IP checksum is offloaded in both direction.
#  For examples, configure adapters of instance#0 and instance#3 to 
#  checksum offload.
#
#Checksum=3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0;


############################################################################
# transfer-speed -
# configures link (or instance) to autonegotiate for a certain speed
# following are valid values for this parameter:
#	0: auto-negotiate
#	10: 10 Mbps
#	100: 100 Mbps
#	1000: 1000 Mbps
#	2500: 2500 Mbps
#
#transfer-speed=1000,1000,1000,1000,1000,0,0,0,0,0,0

############################################################################
# speed : configures link (or instance) to a certain Speed and 
# Duplex mode. By default it is set to auto negotiate. The setup 
# is based on the following values:
#	0	: AutoNegotiate .
#       10 	: Force 10 Mbps speed (Copper only)
#       100 	: Force 100 Mbps (Copper only)
#       1000 	: Force 1000 Mbps (Serdes only)
#
#  For examples, configure adapters of instance#0 and instance#3 to 
#  100 Mbps, and 10 Mbps.
#  speed=100,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0;
#
#speed=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

############################################################################
# full-duplex : configures link (or instance) to a certain Duplex mode. 
# is based on the following values:
#       0 	: Half duplex
#       1 	: Full duplex
#
#full-duplex=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;



############################################################################
# Flow : configures flow control parameters of a link. The setup is 
# based on the following values:
#       0:  Both Tx and Rx flow control are disabled.
#       1:  Tx flow control is enabled.  Pause frames will be sent if 
#           resource is low. But device will not process Rx Pause Frame.
#       2:  Rx flow control is enabled. If device receives Pause Frame,
#           it will stop sending. But device will not send Pause Frame
#           if resource is low.
#       3:  Both Rx and TX flow control are enabled. Pause frames 
#           will be sent if resource is low. If device receives Pause Frame,
#           it will stop sending.
#       4:  Advertise both Rx and TX flow control being enable and negotiate 
#           with link partner. If link AutoNgotiate is not enabled, then
#           both Tx & Rx Flow Control are disabled.
#Flow=4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4;


############################################################################
# multisize: GLD parameter required to support > 64 multicast addresses.
multisize=256


############################################################################
# Jumbo : configures Jumbo Frame feature of a link. The valid range 
# for this parameter is 0 to 3800. If value configured is less then 
# 1500, then Jumbo Frame feature is disable.
#Jumbo=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;



############################################################################
# WireSpeed : configures the device to operate in Ether@WireSpeed mode.
# By default this mode is enabled for all BX2 devices and use has to disable
# if required otherwise. Configuration values are 
#		 '1' : enable ether@wirespeed
#		 '0' : disable ether@wirespeed
#
#WireSpeed=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;


############################################################################
#  RxBufs : configures number of Rx packet descriptor.  The valid value
#  is 32 to 512.  More system memory resource will be used for larger
#   number of Rx Packet Descriptors. Default value is 500.
#
#RxBufs=600;


############################################################################
#  RxTicks: configures number of Rx Host Coalescing Ticks in 
#  microseconds. This determines upper-bound of time interval that the 
#  device will generates interrupt if one or more frames are received. 
#  The default value is 150.
#
#RxTicks=60;


############################################################################
#  Coalesce : configures number of Rx Maximum Coalesced Frames 
#  parameters.  This determines upper-bound of maximum number of Rx buffer 
#  descriptors that device processes before it will generate an interrupt. 
#  The default value is 10.
#
#Coalesce=16;



############################################################################
#  TxTicks: configures number of Tx Host Coalescing Ticks in 
#  microseconds. This determines upper-bound of time interval that the 
#  device will generates interrupt if one or more frames are sent.  The 
#  default value is 500.
#
#TxTicks=60;


############################################################################
#  RxTicksInt: configures number of Rx Host Coalescing Ticks
#  in  microseconds during interrupt. This determines upper-bound of time 
#  interval that the device will generates interrupt if one or more frames 
#  are received during interrupt handling. The default value is 75.
#
#RxTicksInt=45;


############################################################################
#  TxCoalescingTicksDuringInt: configures number of Tx Host Coalescing 
#  Ticks in microseconds during interrupt. This determines upper-bound of 
#  time interval that the device will generates interrupt if one or more 
#  frames are received during interrupt handling.  The default value is 75.
#
#TxTicksInt=45;


############################################################################
#  StatTicks: configures how often adapter statistics are DMAed 
#  to host memory in microsecond.  Default is 1000000.
#
#StatTicks=1000000;




VII. Customize Driver Configuration using NDD command
    ================================================
Driver configuration can also be temporarily changed with Solaris 'ndd'
command. Any changes made with 'ndd' command is lost when the system reboots.
To preserve changes across reboots, please modify parameter values in bnx.conf. 

To display parameters that are accessible via 'ndd', use the following -
	
	ndd /dev/bnx<#instance-number> \?

			OR

	ndd /dev/bnx<#instance-number> '?'
where #instance-number is the device instance adminstrator is try to access

The system should return the following,

?                             (read only)
autoneg_cap                   (read only)
pause_cap                     (read only)
2500fdx_cap                   (read only)
1000fdx_cap                   (read only)
1000hdx_cap                   (read only)
100fdx_cap                    (read only)
100hdx_cap                    (read only)
10fdx_cap                     (read only)
10hdx_cap                     (read only)
adv_autoneg_cap               (read and write)
adv_pause_cap                 (read and write)
adv_2500fdx_cap               (read only)
adv_1000fdx_cap               (read and write)
adv_1000hdx_cap               (read and write)
adv_100fdx_cap                (read and write)
adv_100hdx_cap                (read and write)
adv_10fdx_cap                 (read and write)
adv_10hdx_cap                 (read and write)
lp_autoneg_cap                (read only)
lp_pause_cap                  (read only)
lp_2500fdx_cap                (read only)
lp_1000fdx_cap                (read only)
lp_1000hdx_cap                (read only)
lp_100fdx_cap                 (read only)
lp_100hdx_cap                 (read only)
lp_10fdx_cap                  (read only)
lp_10hdx_cap                  (read only)
link_status                   (read only)
link_speed                    (read only)
link_duplex                   (read only)
link_autoneg                  (read only)
link_rx_pause                 (read only)
link_tx_pause                 (read only)
msi_cnt                       (read and write)
intr_cnt                      (read and write)
hw_cap                        (read only)
adv_cap                       (read only)
debug                         (read only)

The above parameters can be classified into four catagouries -
1. Hardware Capabilities - This parameter group provies hardware
capabities and they are all read-only parameters. 
	- autoneg_cap
	- pause_cap
	- 2500fdx_cap
	- 1000fdx_cap
	- 1000hdx_cap
	- 100fdx_cap
	- 100hdx_cap
	- 10fdx_cap
	- 10hdx_cap
These parameter values can be queried using single 'ndd' command,
	ndd /dev/bnx<#instance-number> hw_cap

2. Advertise Capabilities - Some or all of these parameters are 
are configurable and commands what the device will negotiate with
the link partner. Based on whether the device is Serdes or Copper,
certain parameters are disabled, e.g. '2500fdx_cap' has no meaning
for device with copper connector.
	- adv_autoneg_cap
	- adv_pause_cap
	- adv_2500fdx_cap
	- adv_1000fdx_cap
	- adv_1000hdx_cap
	- adv_100fdx_cap
	- adv_100hdx_cap
	- adv_10fdx_cap
	- adv_10hdx_cap

To configure a particular device parameter use -set option as
explained below -
e.g. 1) Enable 2.5G autoneg on a serdes device (bnx0)
	ndd -set /dev/bnx0 adv_2500fdx_cap 1

e.g. 2) Set device bnx1 to autonegotiate both 100M Full-duplex 
		and 1G full-duplex.
	ndd -set /dev/bnx1 adv_autoneg_cap 1
	ndd -set /dev/bnx1 adv_100fdx_cap 1
	ndd -set /dev/bnx1 adv_1000fdx_cap 1
If multiple speed options are set, driver will choose higher 
priority speed value. The speed value listed above are in
decreasing order in priority, e.g. adv_1000fdx_cap has higest
priority and adv_10hdx_cap has the least. If the user wants to
select 10MB, it is required to turn-off all adv_1000xxx_cap and 
adv_100xxx_cap parameters. Similarly if user wants to force or
autonegotiate for 100MB, both adv_1000?dx_cap parameters should
be reset.

These parameter values can be queried using single 'ndd' command,
	ndd /dev/bnx<#instance-number> adv_cap

3. Link Partner Capabilities - These read-only parameters display
link partner's capabilities
	- lp_autoneg_cap
	- lp_pause_cap
	- lp_2500fdx_cap
	- lp_1000fdx_cap
	- lp_1000hdx_cap
	- lp_100fdx_cap
	- lp_100hdx_cap
	- lp_10fdx_cap
	- lp_10hdx_cap

4. Status parameters - These are also ready only parameters to check
some device properties
	- link_status - 1 = Link Up, 0 =  Link Down
	- link_speed  - 1000 = 1Gbps, 100 = 100Mbps, 10 = 10Mbps
	- link_duplex - 1 = Full Duplex, 0 = Half Duplex
	- link_autoneg - 1 = Autoneg ON, 0 = Autoneg OFF
	- link_rx_pause - 1 = enabled, 0 = disabled
	- link_tx_pause - 1 = enabled, 0 = disabled
	- msi_cnt	- currently not implemented
	- intr_cnt	- currently not implemented
	- hw_cap	- Displays hardware capabilities parameters
	- adv_cap	- current values of advertisement parameters
