If you are using the Free Shipping Options freeoptions shipping module, you could customize the code to allow setting of 2 conditions, one being total >= 300 and the other being weight <= XXXX

This can be done by altering the final tests on the module from OR to AND connectors ...

PHP Code:
// final check for display of Free Options
      
if ($this->ck_freeoptions_total or $this->ck_freeoptions_weight or $this->ck_freeoptions_items) {
        
$this->enabled true;
      } else {
        
$this->enabled false;
      }