@@ -1312,9 +1312,9 @@ static void octeon_destroy_resources(struct octeon_device *oct)
1312
1312
1313
1313
/* fallthrough */
1314
1314
case OCT_DEV_PCI_MAP_DONE :
1315
-
1316
1315
/* Soft reset the octeon device before exiting */
1317
- oct -> fn_list .soft_reset (oct );
1316
+ if ((!OCTEON_CN23XX_PF (oct )) || !oct -> octeon_id )
1317
+ oct -> fn_list .soft_reset (oct );
1318
1318
1319
1319
octeon_unmap_pci_barx (oct , 0 );
1320
1320
octeon_unmap_pci_barx (oct , 1 );
@@ -3823,6 +3823,7 @@ static void nic_starter(struct work_struct *work)
3823
3823
static int octeon_device_init (struct octeon_device * octeon_dev )
3824
3824
{
3825
3825
int j , ret ;
3826
+ int fw_loaded = 0 ;
3826
3827
char bootcmd [] = "\n" ;
3827
3828
struct octeon_device_priv * oct_priv =
3828
3829
(struct octeon_device_priv * )octeon_dev -> priv ;
@@ -3844,9 +3845,23 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
3844
3845
3845
3846
octeon_dev -> app_mode = CVM_DRV_INVALID_APP ;
3846
3847
3847
- /* Do a soft reset of the Octeon device. */
3848
- if (octeon_dev -> fn_list .soft_reset (octeon_dev ))
3848
+ if (OCTEON_CN23XX_PF (octeon_dev )) {
3849
+ if (!cn23xx_fw_loaded (octeon_dev )) {
3850
+ fw_loaded = 0 ;
3851
+ /* Do a soft reset of the Octeon device. */
3852
+ if (octeon_dev -> fn_list .soft_reset (octeon_dev ))
3853
+ return 1 ;
3854
+ /* things might have changed */
3855
+ if (!cn23xx_fw_loaded (octeon_dev ))
3856
+ fw_loaded = 0 ;
3857
+ else
3858
+ fw_loaded = 1 ;
3859
+ } else {
3860
+ fw_loaded = 1 ;
3861
+ }
3862
+ } else if (octeon_dev -> fn_list .soft_reset (octeon_dev )) {
3849
3863
return 1 ;
3864
+ }
3850
3865
3851
3866
/* Initialize the dispatch mechanism used to push packets arriving on
3852
3867
* Octeon Output queues.
@@ -3955,56 +3970,65 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
3955
3970
3956
3971
atomic_set (& octeon_dev -> status , OCT_DEV_IO_QUEUES_DONE );
3957
3972
3958
- dev_dbg (& octeon_dev -> pci_dev -> dev , "Waiting for DDR initialization...\n" );
3959
-
3960
- if (ddr_timeout == 0 )
3961
- dev_info (& octeon_dev -> pci_dev -> dev , "WAITING. Set ddr_timeout to non-zero value to proceed with initialization.\n" );
3973
+ if ((!OCTEON_CN23XX_PF (octeon_dev )) || !fw_loaded ) {
3974
+ dev_dbg (& octeon_dev -> pci_dev -> dev , "Waiting for DDR initialization...\n" );
3975
+ if (!ddr_timeout ) {
3976
+ dev_info (& octeon_dev -> pci_dev -> dev ,
3977
+ "WAITING. Set ddr_timeout to non-zero value to proceed with initialization.\n" );
3978
+ }
3962
3979
3963
- schedule_timeout_uninterruptible (HZ * LIO_RESET_SECS );
3980
+ schedule_timeout_uninterruptible (HZ * LIO_RESET_SECS );
3964
3981
3965
- /* Wait for the octeon to initialize DDR after the soft-reset. */
3966
- while (ddr_timeout == 0 ) {
3967
- set_current_state (TASK_INTERRUPTIBLE );
3968
- if (schedule_timeout (HZ / 10 )) {
3969
- /* user probably pressed Control-C */
3982
+ /* Wait for the octeon to initialize DDR after the soft-reset.*/
3983
+ while (!ddr_timeout ) {
3984
+ set_current_state (TASK_INTERRUPTIBLE );
3985
+ if (schedule_timeout (HZ / 10 )) {
3986
+ /* user probably pressed Control-C */
3987
+ return 1 ;
3988
+ }
3989
+ }
3990
+ ret = octeon_wait_for_ddr_init (octeon_dev , & ddr_timeout );
3991
+ if (ret ) {
3992
+ dev_err (& octeon_dev -> pci_dev -> dev ,
3993
+ "DDR not initialized. Please confirm that board is configured to boot from Flash, ret: %d\n" ,
3994
+ ret );
3970
3995
return 1 ;
3971
3996
}
3972
- }
3973
- ret = octeon_wait_for_ddr_init (octeon_dev , & ddr_timeout );
3974
- if (ret ) {
3975
- dev_err (& octeon_dev -> pci_dev -> dev ,
3976
- "DDR not initialized. Please confirm that board is configured to boot from Flash, ret: %d\n" ,
3977
- ret );
3978
- return 1 ;
3979
- }
3980
3997
3981
- if (octeon_wait_for_bootloader (octeon_dev , 1000 ) != 0 ) {
3982
- dev_err (& octeon_dev -> pci_dev -> dev , "Board not responding\n" );
3983
- return 1 ;
3984
- }
3998
+ if (octeon_wait_for_bootloader (octeon_dev , 1000 )) {
3999
+ dev_err (& octeon_dev -> pci_dev -> dev , "Board not responding\n" );
4000
+ return 1 ;
4001
+ }
3985
4002
3986
- /* Divert uboot to take commands from host instead. */
3987
- ret = octeon_console_send_cmd (octeon_dev , bootcmd , 50 );
4003
+ /* Divert uboot to take commands from host instead. */
4004
+ ret = octeon_console_send_cmd (octeon_dev , bootcmd , 50 );
3988
4005
3989
- dev_dbg (& octeon_dev -> pci_dev -> dev , "Initializing consoles\n" );
3990
- ret = octeon_init_consoles (octeon_dev );
3991
- if (ret ) {
3992
- dev_err (& octeon_dev -> pci_dev -> dev , "Could not access board consoles\n" );
3993
- return 1 ;
3994
- }
3995
- ret = octeon_add_console (octeon_dev , 0 );
3996
- if (ret ) {
3997
- dev_err (& octeon_dev -> pci_dev -> dev , "Could not access board console\n" );
3998
- return 1 ;
3999
- }
4006
+ dev_dbg (& octeon_dev -> pci_dev -> dev , "Initializing consoles\n" );
4007
+ ret = octeon_init_consoles (octeon_dev );
4008
+ if (ret ) {
4009
+ dev_err (& octeon_dev -> pci_dev -> dev , "Could not access board consoles\n" );
4010
+ return 1 ;
4011
+ }
4012
+ ret = octeon_add_console (octeon_dev , 0 );
4013
+ if (ret ) {
4014
+ dev_err (& octeon_dev -> pci_dev -> dev , "Could not access board console\n" );
4015
+ return 1 ;
4016
+ }
4000
4017
4001
- atomic_set (& octeon_dev -> status , OCT_DEV_CONSOLE_INIT_DONE );
4018
+ atomic_set (& octeon_dev -> status , OCT_DEV_CONSOLE_INIT_DONE );
4002
4019
4003
- dev_dbg (& octeon_dev -> pci_dev -> dev , "Loading firmware\n" );
4004
- ret = load_firmware (octeon_dev );
4005
- if (ret ) {
4006
- dev_err (& octeon_dev -> pci_dev -> dev , "Could not load firmware to board\n" );
4007
- return 1 ;
4020
+ dev_dbg (& octeon_dev -> pci_dev -> dev , "Loading firmware\n" );
4021
+ ret = load_firmware (octeon_dev );
4022
+ if (ret ) {
4023
+ dev_err (& octeon_dev -> pci_dev -> dev , "Could not load firmware to board\n" );
4024
+ return 1 ;
4025
+ }
4026
+ /* set bit 1 of SLI_SCRATCH_1 to indicate that firmware is
4027
+ * loaded
4028
+ */
4029
+ if (OCTEON_CN23XX_PF (octeon_dev ))
4030
+ octeon_write_csr64 (octeon_dev , CN23XX_SLI_SCRATCH1 ,
4031
+ 2ULL );
4008
4032
}
4009
4033
4010
4034
handshake [octeon_dev -> octeon_id ].init_ok = 1 ;
@@ -4020,7 +4044,6 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
4020
4044
octeon_dev -> droq [j ]-> pkts_credit_reg );
4021
4045
4022
4046
/* Packets can start arriving on the output queues from this point. */
4023
-
4024
4047
return 0 ;
4025
4048
}
4026
4049
0 commit comments