Ejemplo n.º 1
0
/* Wertkonvertierungen fuer den 'besseren' Außensensor */
static auss2_data process_auss2(time_t timestamp, u_char address, u_char *buffer){
  auss2_data data;						/* Datenstruktur */

  data.timestamp = timestamp;					/* Zeitstempel */
  data.address   = address;					/* Addresse */
  data.temp      = convert_signed_int(buffer[2],buffer[3]);	/* Temparatur */
  data.hum       = remove_msb(buffer[4]);			/* Luftfeuchte */

  DEBUGOUT2("Aussensensor2 an Addresse %i\n", address);
  DEBUGOUT3("Temp.: %3.1f°C  Feuchte: %d%%\n",(data.temp*0.1),data.hum);

  #ifndef NO_LOGING 
    if(get_flag(LOG_DATA_FLAG)){
      check_log_buffer();
      sprintf(prepend_type_address(AUSS2,address), "Temp: %3.1f°C  Hum: %d%%",(data.temp*0.1),data.hum);
      log_data(timestamp, log_buffer);
    }
  #endif

  return data;
}
Ejemplo n.º 2
0
/* Wertkonvertierungen fuer den Regensensor (ein Zaehlschritt = 370ml/m^2)*/
static regen_data process_regen(time_t timestamp, u_char address, u_char *buffer){
  regen_data data;							/* Datenstruktur */
  int new_rain_count = 0;						/* Neuer Zaehlerstand */
  int now_rain_count = 0;						/* Delta-Zaehlerstand */

  data.timestamp = timestamp;						/* Zeitstempel */
  data.address   = address;						/* Addresse */
  new_rain_count = ((buffer[2] & 0x1F) << 7) | remove_msb(buffer[3]);	/* Niederschlagszaehler */
  
  if (get_flag(NOT_USE_ADDR_FLAG))
    address = 0;

  if(last_rain_count[address%16] == -1)						/* Nach Programmstart Zaehler initialisieren */
    last_rain_count[address%16] = new_rain_count;

  now_rain_count = new_rain_count - last_rain_count[address%16];			/* neuen Niederschlag berechnen */
  
  if(now_rain_count < 0){						/* Wenn Integerueberlauf im Sensor */
    now_rain_count = (0x3FFF - last_rain_count[address%16]) + new_rain_count;	/* Dann letzten gemessenen Wert vom Max-Integer-Wert abziehen und neuen Zaehlwert dazurechnen */
    DEBUGOUT1("Integer-Ueberlauf\n");
  }

  data.counter = (now_rain_count * 370);				/* Ein Zaehlschritt entspricht 370ml/m^2, also aenderung mit 370 multiplizieren und zuweisen */

  last_rain_count[address%16] = new_rain_count;					/* Zaehler neu setzen */

  DEBUGOUT2("Regensensor an Addresse %i\n", data.address);
  DEBUGOUT3("Zaehler: %d  Differenz: %d\n", new_rain_count,now_rain_count);
  DEBUGOUT2("Niederschlag: %dml/m^2\n", data.counter);

  #ifndef NO_LOGING 
    if(get_flag(LOG_DATA_FLAG)){
      check_log_buffer();
      sprintf(prepend_type_address(REGEN,address), "Rain: %dml/m^2",data.counter);
      log_data(timestamp, log_buffer);
    }
  #endif

  return data;
}
Ejemplo n.º 3
0
/**
 * i40e_init_lan_hmc - initialize i40e_hmc_info struct
 * @hw: pointer to the HW structure
 * @txq_num: number of Tx queues needing backing context
 * @rxq_num: number of Rx queues needing backing context
 * @fcoe_cntx_num: amount of FCoE statefull contexts needing backing context
 * @fcoe_filt_num: number of FCoE filters needing backing context
 *
 * This function will be called once per physical function initialization.
 * It will fill out the i40e_hmc_obj_info structure for LAN objects based on
 * the driver's provided input, as well as information from the HMC itself
 * loaded from NVRAM.
 *
 * Assumptions:
 *   - HMC Resource Profile has been selected before calling this function.
 **/
enum i40e_status_code i40e_init_lan_hmc(struct i40e_hw *hw, u32 txq_num,
                                        u32 rxq_num, u32 fcoe_cntx_num,
                                        u32 fcoe_filt_num)
{
    struct i40e_hmc_obj_info *obj, *full_obj;
    enum i40e_status_code ret_code = I40E_SUCCESS;
    u64 l2fpm_size;
    u32 size_exp;

    hw->hmc.signature = I40E_HMC_INFO_SIGNATURE;
    hw->hmc.hmc_fn_id = hw->pf_id;

    /* allocate memory for hmc_obj */
    ret_code = i40e_allocate_virt_mem(hw, &hw->hmc.hmc_obj_virt_mem,
                                      sizeof(struct i40e_hmc_obj_info) * I40E_HMC_LAN_MAX);
    if (ret_code)
        goto init_lan_hmc_out;
    hw->hmc.hmc_obj = (struct i40e_hmc_obj_info *)
                      hw->hmc.hmc_obj_virt_mem.va;

    /* The full object will be used to create the LAN HMC SD */
    full_obj = &hw->hmc.hmc_obj[I40E_HMC_LAN_FULL];
    full_obj->max_cnt = 0;
    full_obj->cnt = 0;
    full_obj->base = 0;
    full_obj->size = 0;

    /* Tx queue context information */
    obj = &hw->hmc.hmc_obj[I40E_HMC_LAN_TX];
    obj->max_cnt = rd32(hw, I40E_GLHMC_LANQMAX);
    obj->cnt = txq_num;
    obj->base = 0;
    size_exp = rd32(hw, I40E_GLHMC_LANTXOBJSZ);
    obj->size = (u64)1 << size_exp;

    /* validate values requested by driver don't exceed HMC capacity */
    if (txq_num > obj->max_cnt) {
        ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT;
        DEBUGOUT3("i40e_init_lan_hmc: Tx context: asks for 0x%x but max allowed is 0x%x, returns error %d\n",
                  txq_num, obj->max_cnt, ret_code);
        goto init_lan_hmc_out;
    }

    /* aggregate values into the full LAN object for later */
    full_obj->max_cnt += obj->max_cnt;
    full_obj->cnt += obj->cnt;

    /* Rx queue context information */
    obj = &hw->hmc.hmc_obj[I40E_HMC_LAN_RX];
    obj->max_cnt = rd32(hw, I40E_GLHMC_LANQMAX);
    obj->cnt = rxq_num;
    obj->base = hw->hmc.hmc_obj[I40E_HMC_LAN_TX].base +
                (hw->hmc.hmc_obj[I40E_HMC_LAN_TX].cnt *
                 hw->hmc.hmc_obj[I40E_HMC_LAN_TX].size);
    obj->base = i40e_align_l2obj_base(obj->base);
    size_exp = rd32(hw, I40E_GLHMC_LANRXOBJSZ);
    obj->size = (u64)1 << size_exp;

    /* validate values requested by driver don't exceed HMC capacity */
    if (rxq_num > obj->max_cnt) {
        ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT;
        DEBUGOUT3("i40e_init_lan_hmc: Rx context: asks for 0x%x but max allowed is 0x%x, returns error %d\n",
                  rxq_num, obj->max_cnt, ret_code);
        goto init_lan_hmc_out;
    }

    /* aggregate values into the full LAN object for later */
    full_obj->max_cnt += obj->max_cnt;
    full_obj->cnt += obj->cnt;

    /* FCoE context information */
    obj = &hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX];
    obj->max_cnt = rd32(hw, I40E_GLHMC_FCOEMAX);
    obj->cnt = fcoe_cntx_num;
    obj->base = hw->hmc.hmc_obj[I40E_HMC_LAN_RX].base +
                (hw->hmc.hmc_obj[I40E_HMC_LAN_RX].cnt *
                 hw->hmc.hmc_obj[I40E_HMC_LAN_RX].size);
    obj->base = i40e_align_l2obj_base(obj->base);
    size_exp = rd32(hw, I40E_GLHMC_FCOEDDPOBJSZ);
    obj->size = (u64)1 << size_exp;

    /* validate values requested by driver don't exceed HMC capacity */
    if (fcoe_cntx_num > obj->max_cnt) {
        ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT;
        DEBUGOUT3("i40e_init_lan_hmc: FCoE context: asks for 0x%x but max allowed is 0x%x, returns error %d\n",
                  fcoe_cntx_num, obj->max_cnt, ret_code);
        goto init_lan_hmc_out;
    }

    /* aggregate values into the full LAN object for later */
    full_obj->max_cnt += obj->max_cnt;
    full_obj->cnt += obj->cnt;

    /* FCoE filter information */
    obj = &hw->hmc.hmc_obj[I40E_HMC_FCOE_FILT];
    obj->max_cnt = rd32(hw, I40E_GLHMC_FCOEFMAX);
    obj->cnt = fcoe_filt_num;
    obj->base = hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].base +
                (hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].cnt *
                 hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].size);
    obj->base = i40e_align_l2obj_base(obj->base);
    size_exp = rd32(hw, I40E_GLHMC_FCOEFOBJSZ);
    obj->size = (u64)1 << size_exp;

    /* validate values requested by driver don't exceed HMC capacity */
    if (fcoe_filt_num > obj->max_cnt) {
        ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT;
        DEBUGOUT3("i40e_init_lan_hmc: FCoE filter: asks for 0x%x but max allowed is 0x%x, returns error %d\n",
                  fcoe_filt_num, obj->max_cnt, ret_code);
        goto init_lan_hmc_out;
    }

    /* aggregate values into the full LAN object for later */
    full_obj->max_cnt += obj->max_cnt;
    full_obj->cnt += obj->cnt;

    hw->hmc.first_sd_index = 0;
    hw->hmc.sd_table.ref_cnt = 0;
    l2fpm_size = i40e_calculate_l2fpm_size(txq_num, rxq_num, fcoe_cntx_num,
                                           fcoe_filt_num);
    if (NULL == hw->hmc.sd_table.sd_entry) {
        hw->hmc.sd_table.sd_cnt = (u32)
                                  (l2fpm_size + I40E_HMC_DIRECT_BP_SIZE - 1) /
                                  I40E_HMC_DIRECT_BP_SIZE;

        /* allocate the sd_entry members in the sd_table */
        ret_code = i40e_allocate_virt_mem(hw, &hw->hmc.sd_table.addr,
                                          (sizeof(struct i40e_hmc_sd_entry) *
                                           hw->hmc.sd_table.sd_cnt));
        if (ret_code)
            goto init_lan_hmc_out;
        hw->hmc.sd_table.sd_entry =
            (struct i40e_hmc_sd_entry *)hw->hmc.sd_table.addr.va;
    }
    /* store in the LAN full object for later */
    full_obj->size = l2fpm_size;

init_lan_hmc_out:
    return ret_code;
}